原创地址为:https://blog.csdn.net/zhzht19861011/article/details/50920336
FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互斥量和递归互斥量看成特殊的信号量。
信号量API函数实际上都是宏,它使用现有的队列机制。这些宏定义在semphr.h文件中。如果使用信号量或者互斥量,需要包含semphr.h头文件。 二进制信号量、计数信号量和互斥量信号量的创建API函数是独立的,但是获取和释放API函数都是相同的;递归互斥信号量的创建、获取和释放API函数都是独立的。 1创建二进制信号量
1.1函数描述 SemaphoreHandle_t xSemaphoreCreateBinary( void ); 这个函数用于创建一个二进制信号量。二进制信号量要么有效要么无效,这也是为什么叫做二进制的原因。 新创建的信号量处于无效状态,这意味着使用API函数xSemaphoreTake()获取信号之前,需要先给出信号。 二进制信号量和互斥量非常相似,但也有细微的区别:互斥量具有优先级继承机制,二进制信号量没有这个机制。这使得二进制信号量更适合用于同步(任务之间或者任务和中断之间),互斥量更适合互锁。 一旦获得二进制信号量后不需要恢复,一个任务或中断不断的产生信号,而另一个任务不断的取走这个信号,通过这样的方式来实现同步。 低优先级任务拥有互斥量的时候,如果另一个高优先级任务也企图获取这个信号量,则低优先级任务的优先级会被临时提高,提高到和高优先级任务相同的优先级。这意味着互斥量必须要释放,否则高优先级任务将不能获取这个互斥量,并且那个拥有互斥量的低优先级任务也永远不会被剥夺,这就是操作系统中的优先级翻转。 互斥量和二进制信号量都是SemaphoreHandle_t类型,并且可以用于任何具有这类参数的API函数中。 1.1.2返回值
- NULL:创建信号量失败,因为FreeRTOS堆栈不足。
- 其它值:信号量创建成功。这个返回值存储着信号量句柄。
1.1.3用法举例
SemaphoreHandle_t xSemaphore;
void vATask( void * pvParameters )
{
/* 创建信号量 */
xSemaphore = xSemaphoreCreateBinary();
if( xSemaphore == NULL )
{
/* 因堆栈不足,信号量创建失败,这里进行失败处理*/
}
else
{
/* 信号量可以使用。信号量句柄存储在变量xSemahore中。
如果在这里调用API函数xSemahoreTake()来获取信号量,
则必然是失败的,因为创建的信号量初始是无效(空)的。*/
}
}
|