FreeRTOS创建的任务都有一个任务控制块。
任务控制块本质上是一个结构体变量,用于记录任务的相关的消息。
结构体变量中有一个专门用于任务通知的32位变量ulNotifiedValue。
ulNotifiedValue可取代计数信号,二值信号,事件标志组
特点: 节省内存,提高效率,只有一个任务等待
- ulNotifiedValue数值进行加一或减一就是计数信号量
- ulNotifiedValue数值取值0或1就是二值信号量
- ulNotifiedValue数值按位设置bit0-bit31就是事件标志组
任务信号量
ulNotifiedValue 计数信号表示可用的资源大小,多用于任务同步
任务计数信号API | 功能 |
---|---|
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ) | 释放信号量,信号量+1 |
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit,TickType_t xTicksToWait ) | 获取信号量,信号量-1或清零,参数1为pdFALSE表示计数信号,参数1为pdTRUE表示二值信号 |
void vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify,BaseType_t *pxHigherPriorityTaskWoken ) | 释放信号量,信号量+1(中断) |
**释放信号量**
xTaskNotifyGive(xHandleTaskMsgPro);
**获取计数信号量**
ulNotifiedValue = ulTaskNotifyTake(pdFALSE,xBlockTime);
**获取二值信号量**
ulNotifiedValue = ulTaskNotifyTake(pdTRUE,xBlockTime);
任务事件标志组
ulNotifiedValue的bit0-bit31用于事件标志
任务事件标志API | 功能 |
---|---|
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,uint32_t ulValue, eNotifyAction eAction ) | 设置事件标志位,eAction表示任务通知类型,事件标志模式为eSetBits |
BaseType_t xTaskNotifyWait(。。。) | 获取事件标志位 |
aseType_t xTaskNotifyFromISR(。。。) | 设置事件标志位(中断) |
参数 eNotifyAction: 任务通知模式
eNoAction 无任务通知,控制块中的ulNotifiedValue值无效
eSetBits 事件标志组模式
eIncrement 信号量模式
eSetValueWithOverwrite 消息邮箱模式
eSetValueWithoutOverwrite 消息邮箱不允许覆盖模式
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue,eNotifyAction eAction );
任务消息邮箱
消息邮箱本质上就是长度为1的消息队列。
任务消息邮箱是将任务控制块中的ulNotifiedValue值当作单个消息。
任务消息邮箱API | 功能 |
---|---|
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,uint32_t ulValue, eNotifyAction eAction ) | 发送消息,eAction表示任务通知类型,消息邮箱模式为eSetValueWithOverwrite |
BaseType_t xTaskNotifyWait(0x00000000,0xFFFFFFFF,&ulValue,xMaxBlockTime) | 接收消息 |
aseType_t xTaskNotifyFromISR(。。。) | 设置事件标志位(中断) |
xResult = xTaskNotifyWait(0x00000000, 0xFFFFFFFF, &ulValue,MaxDelay);