rtt——线程间通信(互斥量)

freertos

互斥量的概念

在 RT-Thread 中,互斥量(Mutex,互斥锁)用于确保共享资源在任意时刻只被一个线程访问

  • 确保共享资源的互斥访问:互斥量用于保护对共享资源的访问,确保在任意时刻只有一个线程可以访问该资源;避免多个线程同时修改共享资源而导致的数据不一致或竞态条件

  • 实现临界区保护:互斥量通常用于实现临界区保护,将对共享资源的访问限制在临界区内。只有获取了互斥量的线程才能进入临界区,其他线程需要等待互斥量释放后才能进入

  • 防止死锁和资源竞争:RT-Thread 的互斥量实现通常会考虑死锁和资源竞争的问题

  • 提供更细粒度的同步机制:相比信号量,互斥量提供了更细粒度的同步机制;它通常用于保护单个共享资源或临界区,而信号量则更适合用于限制对资源数量的访问

互斥量只有两个状态:被锁定和未锁定

即当一个低优先级任务持有互斥量时,系统会提升其优先级到需要访问该资源的最高优先级任务的优先级,以防止高优先级任务被阻塞(优先级翻转

互斥量相关接口

创建互斥量

rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag);

删除互斥量

rt_err_t rt_mutex_delete(rt_mutex_t mutex);

初始化互斥量

rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag);

脱离互斥量

rt_err_t rt_mutex_detach(rt_mutex_t mutex);

获取互斥量

  • 如果互斥量没有被其他线程控制,那么申请该互斥量的线程将成功获得该互斥量;

  • 如果互斥量已经被当前线程线程控制,则该互斥量的持有计数加 1,当前线程也不会挂起等待;

  • 如果互斥量 已经被其他线程占有,则当前线程在该互斥量上挂起等待,直到其他线程释放它或者等待时间超过指定的 超时时间

rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time);

释放互斥量

只有已经拥有互斥量控制权的线程才能释放它,每释放一次该互斥量,它的持有计数就减1

当该互斥量的持有计数为零时(即持有线程已经释放所有的持有操作),它变为可用,等待在该信号量上的线程将被唤醒

如果线程的运行优先级被互斥量提升, 那么当互斥量被释放后,线程恢复为持有互斥量前的优先级。

rt_err_t rt_mutex_release(rt_mutex_t mutex);

相关文章

rtt——线程间通信(消息队列)

**消息队列是一种线程间的通信方式,是邮箱的扩展** 消息队列的工作机制 消息队列能够接收来自线程或中断服务例程中**不固定长度的消息**,**并把消息缓存在自己的内存空间中**。其他线程也能够从消息队列中读取相应的消息,而当消息队列为空时,可挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒为接收并处理消息 **消息队列是一种异步的通信方式** 通常将先进入消息队列的消息先传给线程...

freertos

rtt——线程间的通信(邮箱)

邮箱 **邮箱是实时操作系统中的一种典型的线程间的通信方式** **邮箱的通信方式除了可以一对一,也可以一对多通信,或者多对多通信** 邮箱的工作机制 在RT-thread操作系统中,邮箱是开销较低、效率较高的一种线程间通信方式。 **邮箱中的每一封邮件的容量固定为4字节(刚好容下一个32位系统的指针)** 线程或中断服务程序把一封长度为4字节的邮件发送到指定邮箱中,而其他一...

freertos

rtt——时钟管理

嘀嗒时钟 时钟tick的频率一般由RT\_TICK\_PER\_SECOND宏定义决定,系统默认设置RT\_TICK\_PER\_SECOND为1000,注意RT\_TICK\_PER\_SECOND不能大于1000,防止嘀嗒硬件溢出,无返回值 定时器 我们首先要区分操作系统定时器和芯片上的硬件定时器: - 硬件定时器:是芯片本身提供的定时功能,一般由外部晶振提供芯片输入时钟,当到达...

freertos