原文链接
任务通知
使用队列、信号量、事件组等等方法时,并不知道对方是谁。使用任务通知时,可以明确指定:通知哪个任务。
任务通知结构体中只有一个任务通知值,只能保持一个数据。
数据智能给目标任务独享。
任务通知只能一个一个发任务,而且不能广播给多个任务。
即使对方无法接收数据,发送方也无法阻塞等待,只能即刻返回错误。
通知的内部结构
每个任务有一个TCB结构体,里面包括通知状态和通知值。
通知状态有三种:
taskNOT_WAITING_NOTIFICATION:任务没有在等待通知
taskWAITING_NOTIFICATION:任务在等待通知
taskNOTIFICATION_RECEIVED:任务接收到了通知,也被称为pending(有数据了,待处理)
通知值可以是计数值,二进制位,任意数值
任务通知函数
简化版:xTaskNotifyGive/ulTaskNotifyTake
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken );
使通知值+1,并使状态变为“pending”,表示有数据,待处理
xClearCountOnExit 函数返回前是否清零: pdTRUE:把通知值清零 pdFALSE:如果通知值大于0,则把通知值减一
xTicksToWait 任务进入阻塞态的超时时间,它在等待通知值大于0。 0:不等待,即刻返回; portMAX_DELAY:一直等待,直到通知值大于0; 其他值:Tick Count,可以用*pdMS_TO_TICKS()*把ms转换为Tick Count
返回值 函数返回之前,在清零或减一之前的通知值。 如果xTicksToWait非0,则返回值有2种情况: 1. 大于0:在超时前,通知值被增加了 2. 等于0:一直没有其他任务增加通知值,最后超时返回0
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
如果通知值为0则任务阻塞;通知值大于0则任务就绪
暂时先记录简化版函数