FreeRTOS 信号量

来源:互联网 发布:易观智库数据准确么 编辑:程序博客网 时间:2024/05/20 03:41

FreeRTOS 的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互斥量和递归互斥量看成特殊的信号量。

信号量 API 函数实际上都是宏,它使用现有的队列机制。这些宏定义在 semphr.h 文件中。如果使用信号量或者互斥量,需要包含 semphr.h 头文件。

二进制信号量、计数信号量和互斥量信号量的创建 API 函数是独立的,但是获取和释放 API 函数都是相同的;递归互斥信号量的创建、获取和释放API函数都是独立的。

二进制信号量互斥量非常相似,但也有细微的区别:互斥量具有优先级继承机制,二进制信号量没有这个机制。这使得二进制信号量更适合用于同步(任务之间或者任务和中断之间),互斥量更适合互锁。

互斥量和二进制信号量都是SemaphoreHandle_t类型。

二进制信号量

一旦获得二进制信号量后不需要恢复,一个任务或中断不断的产生信号,而另一个任务不断的取走这个信号,通过这样的方式来实现同步。

互斥量

互斥量是一个包含优先级继承机制的二进制信号量。

  • 若用于实现同步(任务之间或者任务与中断之间)的,优先考虑使用二进制信号量,互斥量通常用于简单的互锁。
  • 中断不能因为等待互斥量而阻塞。
  • 低优先级任务拥有互斥量的时候,如果另一个高优先级任务也企图获取这个互斥量,则低优先级任务的优先级会被临时提高,提高到和高优先级任务相同的优先级。这意味着互斥量必须要释放,否则高优先级任务将不能获取这个互斥量,并且那个拥有互斥量的低优先级任务也永远不会被剥夺,这就是操作系统中的优先级翻转