FreeRTOS 任务与调度器(2)

 在上一篇我们介绍了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函数

 

2.1、发送通知

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信