FreeRTOS的二值信号量和互斥量之间的区别和联系

目录

1. 二值信号量和互斥量的作用

1.1 二值信号量的作用

1.2 互斥量的作用

2. FreeRTOS二值信号量和互斥锁关系

2.1 不同点

2.2 相同点

3. 如何选择

3.1 根据场景选择合适的同步机制

3.2 根据优先级设计同步机制


FreeRTOS是一款广泛应用于嵌入式系统中的实时操作系统,其中信号量(Semaphore)是常见的用于多线程条件同步和资源保护的机制。所有的信号量的本质的都是特殊的队列(特殊:信号量只有队列头部,并没有后面的环形存储区,也就是说信号量只负责消息传递,并不传递数据)信号量用来进行共享资源的管理和任务同步。FreeRTOS中的信号量分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。

在实际应用中,选择正确的同步机制对于系统性能和稳定性至关重要。因此,我们需要详细了解FreeRTOS二值信号量和互斥锁之间的区别和联系。

1. 二值信号量和互斥量的作用

1.1 二值信号量的作用

二值信号量可以用于任务与任务或中断与任务之间的同步,和计数信号量类似。在执行中断服务函数的时候可以通过向任务发送信号量来通知任务它所期待的事件发生了,当退出中断服务函数以后在任务调度器的调度下同步的任务就会执行。当中断发生的时候就释放信号量,中断服务函数不做具体的处理。具体的处理过程做成一个任务,这个任务会获取信号量,如果获取到信号量就说明中断发生了,那么就开始完成相应的处理,这样做的好处就是中断执行时间非常短。这个例子就是中断与任务之间使用信号量来完成同步,同样,任务与任务之间也可以使用信号量来完成同步。

二值信号量也可以用于共享资源的管理。举个例子一个共享资源,一次只能一个任务使用且只有使用和未使用两种状态。使用共享资源的两个状态作为信号量的话,那么这就是二值信号量。

1.2 互斥量的作用

互斥量(mutex)又称互斥信号量,是一个特殊的二值信号量,可以通过它来确保执行流在代码关键区互相排斥,从而对共享资源进行独占式处理。互斥量是二进制信号量的一个变种,开启互斥量需要在头文件FreeRTOSConfig.h中设置configUSE_MUTEXES为1。任意时刻互斥量的状态只有两种,开锁或闭锁。

2. FreeRTOS二值信号量和互斥锁关系

接下来主要说二进制信号和互斥量的关系

2.1 不同点

(1)优先级反转问题

互斥量和二值信号量最大的区别就是:互斥量具有优先级继承继承。例如,低优先级的任务A持有互斥量的时候,优先级高的任务B开始尝试获得这个锁。但是任务B无法获取互斥量而进入阻塞状态。正在使用互斥量的任务A会临时将优先级提升到任务B的优先级。这个优先级提升的过程就是优先级继承。这个机制用于确保高优先级任务进入组赛状态的时间尽可能地短。

(2)应用的优势场景不同:

二值信号量更适合用于用于任务与任务或中断与任务之间的同步,互斥量更适合用于互斥,用于保护保护只能有一个任务访问的共享资源。

互斥量不能用于中断服务程序中,信号量可以。因为互斥可能会阻塞,但是中断不能阻塞等待;而且互斥量有优先级继承机制,只有互斥量从任务中释放和获取时才有意义,而不是中断。

(3)使用API创建不同

FreeRTOS创建二值信号量的API是

SemaphoreHandle_t xSemaphoreCreateBinary( void )

如果创建成功则返回新创建的二值信号量的句柄,否则返回NULL。

FreeRTOS创建互斥量的API是

SemaphoreHandle_t xSemaphoreCreateMutex( void )

同样,创建成功返回互斥量的句柄,创建不成功返回NULL。

2.2 相同点

(1)同为用于多线程条件同步的机制

(2)都可用于对共享资源的保护

3. 如何选择

3.1 根据场景选择合适的同步机制

互斥量是包含优先级继承机制的二值信号量。二值信号量是实现同步(任务之间或任务和中断之间)的更好选择,而互斥量是实现简单互斥的更好选择,虽然互斥量也可以用于任务与任务之间、任务与中断之间的同步,但是互斥量更多用于保护共享资源的互锁。

3.2 根据优先级设计同步机制

因为二值信号量没有优先级继承继承,所以二值信号量相对适合优先级高的任务。

猜你喜欢

转载自blog.csdn.net/panpan_jiang1/article/details/130886355