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);
posted on 2021-05-17 15:16  若水千点  阅读(349)  评论(0)    收藏  举报