任务通知
任务通知的理解
使用队列、信号量、事件组时,我们都要事先创建对应结构体;
而使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收通知。即我们不需要另外去创建通知,其内部就有这个属性。
在任务通知中,通知者不会等待发送是否成功,而接收者可以等待通知时阻塞。
任务通知有三个状态(Notify State),分别为:
- 任务没有等待通知
- 任务在等待通知
- 任务接收到通知待处理
任务通知的性质:
任务通知可以对一位的val进行修改,在某些特点的情况下可以用作消息队列或信号量来使用。如使用val来作为一位数据进行通信,或对val进行增加清除做二进制信号量使用。
任务通知使用——轻量级信号量
任务通知计数值增加,该变量为任务的TCB(TaskHandle_t类型),该函数使计数值++。
1 | xTaskNotifyGive(xTaskTCB2); |
读取任务通知的函数如下;
1 | val = ulTaskNotifyTake(pdFALSE, portMAX_DELAY); |
该函数的返回值是任务通知的计数值。输入变量:
- 是否清空计数值
- 等待时间
不清理计数值的情况下,该函数读取到通知后对计数值进行–操作。
在清理计数值的情况下,不管计数值是多少,读取后清零。
任务通知使用——轻量级队列
TCB结构体中,有value和state属性,
1 | xTaskNotify( xTaskToNotify, ulValue, eAction ) |
任务通知
- @param xTaskToNotify通知任务的TCB句柄
- @param ulValue 传入的数值
- @param eAction 设置参数,可以设置是否覆盖(队列)
1
xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait )
- @param ulBitsToClearOnEntry 进入时需要清空的位数
- @param ulBitsToClearOnExit 出去时需要清空的位数
- @param pulNotificationValue 读取数值需要输入到哪个地址
- @param xTicksToWait 等待时间
任务通知使用——轻量级事件组
事件组的基本原理是,通过一个数据的某一位作为逻辑条件,判断代码是否继续进行。通过这个原理,可以使用任务通知来作为轻量级的事件组
作为事件组使用,写的时候使用只写bit功能,读取的时候需要把读取的数据进行位数逻辑判断。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com