在上一篇我们介绍了FreeRTOS任务的一些基本操作和功能,今天我们会介绍一个很好很强大的功能——任务通知
任务通知可以在不同任务之间传递信息,它可以取代二值信号量、计数信号量、事件标志组、深度为1的消息队列等功能,因为它更快,占用RAM更少,是FreeRTOS自8.2以来推出的重大改进功能。
一、任务通知相关变量
1.1、TCB中的通知相关成员
FreeRTOS每个任务都有一个通知指示值,和一个32位通知值:
任务数据结构(TCB)中与队列通知相关的成员
#if ( configUSE_TASK_NOTIFICATIONS == 1 ) volatile uint32_t ulNotifiedValue; volatile eNotifyValue eNotifyState; #endif
- ulNotifiedValue就是任务中的通知值,任务通知实际上就是围绕这个变量作文章,下面会以“通知值”来代替这个成员变量,
- eNotifyState用来标志任务是否在等待通知,它有以下3种情况
| eNotified | 任务已经被通知 | 带发送通知功能的函数都会首先把eNotifyState设置为eNotified,表示任务已经被通知 |
| eWaitingNotification | 任务正在等待通知 | 接收通知功能的函数会首先把eNotifyState设置为eWaitingNotification,表示任务已经阻塞了正在等待通知 |
| eNotWaitingNotification | 空状态 | 表示任务即没有收到新的通知,也没有正在等待通知,接收通知功能函数在接收到通知处理后,会把eNotifyState设置为eWaitingNotification |
根据上一节中的TCB我们的精简,我们现在为TCB补上接下来会用到新的成员:
typedef struct tskTaskControlBlock { volatile StackType_t *pxTopOfStack; /*任务堆栈栈顶*/ ListItem_t xGenericListItem; /*任务状态列表项项引用的列表,指示任务状态(准备态、阻塞态、挂起态)*/ ListItem_t xEventListItem; /*状态列表项*/ UBaseType_t uxPriority; /*任务优先级*/ StackType_t *pxStack; /*任务堆栈起始地址*/ char pcTaskName[ configMAX_TASK_NAME_LEN ];/*任务名字*/ volatile uint32_t ulNotifiedValue; /*任务通知值*/ volatile eNotifyValue eNotifyState; /*通知状态标志*/ } tskTCB;
二、任务通知API函数


