河南省建设安全监督站的网站,宁波免费seo排名优化,招聘网站开发源码,装修设计公司哪家1.任务通知的简介
任务通知#xff1a;用来通知任务的#xff0c;任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值。
使用队列、信号量、事件标志组时都需另外创建一个结构体#xff0c;通过中间的结构体进行间接通信#xff01; 使用任务通知时#xff0c…1.任务通知的简介
任务通知用来通知任务的任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值。
使用队列、信号量、事件标志组时都需另外创建一个结构体通过中间的结构体进行间接通信 使用任务通知时任务结构体TCB中就包含了内部对象可以直接接收别人发过来的通知
任务通知值的更新方式
不覆盖接受任务的通知值【类似队列不覆写】覆盖接受任务的通知值【类似队列覆写】更新接受任务通知值的一个或多个bit【类似任务标志组】增加接受任务的通知值【类似信号量】只要合理灵活的利用任务通知的特点可以在一些场合中替代队列、信号量、事件标志组
任务通知的优势及劣势
效率更高快使用任务通知向任务发送事件或数据比使用队列、事件标志组或信号量快得多使用内存更小使用其他方法时都要先创建对应的结构体使用任务通知时无需额外创建结构体 无法发送数据给ISRISR没有任务结构体所以无法给ISR发送数据。但是ISR可以使用任务通知的功能发数据给任务无法广播给多个任务任务通知只能是被指定的一个任务接收并处理无法缓存多个数据任务通知是通过更新任务通知值来发送数据的任务结构体中只有一个任务通知值只能保持一个数据发送受阻不支持阻塞发送方无法进入阻塞状态等待 任务通知有速度快、内存小的优势但是中断不能收数据只能一对一只有一个数据量发送不支持阻塞。多用于一对一通知 2.任务通知值和通知状态
任务都有一个结构体任务控制块TCB它里边有两个结构体成员变量
typedef struct tskTaskControlBlock
{//… …#if ( configUSE_TASK_NOTIFICATIONS 1 )volatile uint32_t ulNotifiedValue [ configTASK_NOTIFICATION_ARRAY_ENTRIES ];volatile uint8_t ucNotifyState [ configTASK_NOTIFICATION_ARRAY_ENTRIES ];endif//… …
} tskTCB;
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 /* 定义任务通知数组的大小, 默认: 1 */ulNotifiedValue是 uint32_t 类型用来表示通知值 ucNotifyState是 uint8_t 类型用来表示通知状态
任务通知值的更新方式有多种类型
计数值数值累加类似信号量相应位置一类似事件标志组任意数值支持覆写和不覆写类似队列
任务通知状态共有3种取值
#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* 任务未等待通知 */
#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) /* 任务在等待通知 */
#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) /* 任务在等待接收 */任务未等待通知 任务通知默认的初始化状态等待通知接收方已经准备好了调用了接收任务通知函数等待发送方给个通知等待接收发送方已经发送出去调用了发送任务通知函数等待接收方接收
3.任务通知相关API函数介绍
任务通知API函数主要有两类①发送通知 ②接收通知。 【注意】发送通知API函数可以用于任务和中断服务函数中接收通知API函数只能用在任务中。
xTaskNotify()发送任务通知带有通知值xTaskNotifyAndQuery()发送任务通知带有通知值保留接收任务原通知值xTaskNotifyGive()发送任务通知不带通知值xTaskNotifyFromISR()在中断中发送任务通知xTaskNotifyAndQueryFromISR()在中断中发送任务通知vTaskNotifyGiveFromISR()在中断中发送任务通知ulTaskNotifyTake()获取任务通知可以设置在退出此函数的时候将任务通知值清零或者减一。xTaskNotifyWait()获取任务通知比 ulTaskNotifyTak()更为复杂可获取通知值和清除通知值的指定位。 xTaskNotifyAndQuery()和xTaskNotify()常用于模拟写队列/设置标志位ulTaskNotifyTake()常用于读队列/清除标志位 xTaskNotifyGive()常用于模拟信号量释放ulTaskNotifyTake()常用于模拟信号量获取 下方的函数和上述的函数基本一致只不过可以操作下表不为0的元素操作不常用 3.1.发送任务通知
#define xTaskNotifyAndQuery(xTaskToNotify, ulValue , eAction , pulPreviousNotifyValue )xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY), (ulValue), (eAction), (pulPreviousNotifyValue ))
#define xTaskNotify(xTaskToNotify , ulValue , eAction )xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY), (ulValue), (eAction), NULL)
#define xTaskNotifyGive( xTaskToNotify )xTaskGenericNotify((xTaskToNotify), (tskDEFAULT_INDEX_TO_NOTIFY), (0), eIncrement, NULL)BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,UBaseType_t uxIndexToNotify,uint32_t ulValue,eNotifyAction eAction,uint32_t * pulPreviousNotificationValue )typedef enum
{ eNoAction 0, /* 无操作 */eSetBits /* 更新指定bit */eIncrement /* 通知值加一 */eSetValueWithOverwrite /* 覆写的方式更新通知值 */eSetValueWithoutOverwrite /* 不覆写通知值 */
} eNotifyAction;形参xTaskIaNatify接收任务通知的任务句柄形参uxIndexToNotify任务的指定通知任务通知相关数组成员第0个元素形参ulValue任务通知值形参eAction通知方式通知值更新方式形参pulPreviousNotificationValue用于保存更新前的任务通知值(为NULL则不保存)
3.2.发送任务通知底层函数xTaskGenericNotify( )解析 3.3.获取任务通知
#define ulTaskNotifyTake( xClearCountOnExit , xTicksToWait )ulTaskGenericNotifyTake ( ( tskDEFAULT_INDEX_TO_NOTIFY ),//任务的指定通知( xClearCountOnExit ),( xTicksToWait ) ) 形参uxlndexToWaitQn任务的指定通知任务通知相关数组成员)形参xClearCountOnExit指定在成功接收通知后将通知值清零或减1pdTRUE:把通知值清零pdEAL.SE:把通知值减一形参xTicksToWait阻塞等待任务通知值的最大时间返回值0接收失败非0接收成功返回任务通知的通知值
#define xTaskNotifyWait( ulBitsToClearOnEntry,ulBitsToClearOnExit, pulNotificationValue, xTicksToWait)xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY,( ulBitsToClearOnEntry ),( ulBitsToClearOnExit ), ( pulNotificationValue ),( xTicksToWait )) BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t * pulNotificationValue,TickType_t xTicksToWait);形参uxlndexToWaitOn任务的指定通知任务通知相关数组成员)形参ulBitesToClearOnEntry等待前清零指定任务通知值的比特位旧值对应bit清0)形参ulBitesToClearOnExit成功等待后清零指定的任务通知值比特位新值对应bit清0)形参pulNotificationValue用来取出通知值如果不需要取出可设为NULL)形参xTicksToWait阻塞等待任务通知值的最大时间返回值pdTRUE等待任务通知成功pdFALSE等待任务通知失败
3.4.ulTaskNotifyTake( )与xTaskNotifyWait( )函数解析
ulTaskNotifyTake( ) ulTaskNotifyTake( )
4.任务通知模拟信号量实验
实验目的学习使用 FreeRTOS 中的任务通知功能模拟二值信号量和计数型信号量实验设计将设计三个任务start_task、task1、task2 start_task用来创建task1和task2任务 task1用于按键扫描当检测到按键KEY0被按下时将发送任务通知 task2用于接收任务通知并打印相关提示信息
5.任务通知模拟消息邮箱实验
实验目的学习使用 FreeRTOS 中的任务通知功能模拟消息邮箱实验设计将设计三个任务start_task、task1、task2 start_task用来创建task1和task2任务 task1用于按键扫描将按下的按键键值通过任务通知发送给指定任务 task2用于接收任务通知并根据接收到的数据做相应动作 6.任务通知模拟事件标志组实验
实验目的学习使用 FreeRTOS 中的任务通知功能模拟事件标志组实验设计将设计三个任务start_task、task1、task2 start_task用来创建task1和task2任务 task1用于按键扫描当检测到按键按下时发送任务通知设置不同标志位 task2用于接收任务通知并打印相关提示信息