FreeRTOS任务通知 | FreeRTOS十二

目录

说明:

一、任务通知

1.1、什么是任务通知

1.2、任务通知优势与劣势

1.3、任务通知值的更新方式

1.4、任务通知值状态

1.5、任务通知状态

1.6、任务通知方式类型

二、任务通知相关API函数

2.1、常用的发送通知API函数

2.2、带通知值的发送通知函数

2.3、常用的接收通知API函数

2.4、ulTaskGenericNotifyTake函数

2.5、xTaskGenericNotifyWait函数

2.6、最佳使用场合


说明:

关于内容:

    1)以下内容多为概念了解与步骤分析

    2)暂无个人示例代码,使用的是FreeRTOS的官方示例代码

    3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试

关于其它:

    1)操作系统:win 10

    2)平台:keil 5 mdk

    3)语言:c语言

    4)板子:STM32系列移植FreeRTOS
 

一、任务通知

1.1、什么是任务通知

        用来通知任务的,任务控制块中的结构体成员ulNotifiedValue就是这个通知值。

1.2、任务通知优势与劣势

优势:

        1)效率更高,使用任务通知向任务发送事件或数据比使用队列、事件标志组或信号量快得多;

        2)使用内存小,使用其他方法都需要创建对应的结构体,使用任务通知无需创建结构体。

劣势:

        1)无法发送数据给ISR(中断),ISR没有结构体(通过结构体成员ulNotifiedValue),所以无法给ISR发送数据。但ISR可以使用任务通知,给任务发送数据;

        2)无法广播多个任务,任务通知只能给指定的一个任务接收并处理;

        3)无法缓存多个数据,任务通知是通过更新任务通知值来发送数据的,任务结构体中只有一个任务通知值,只能保存一个数据;

        4)发送受阻不支持,发送方无法进入阻塞状态等待。

1.3、任务通知值的更新方式

        1)不覆盖接受任务的通知值;

        2)覆盖接受任务的通知值;

        3)更新接受任务通知值的一个或多个bit;

        4)增加接受任务的通知值。

类型如下:

        1)计数值(数值累计,类型信号量)

        2)对应位,置一(类似事件标志组)

        3)任意数值(支持覆写或不覆写,类似队列)

以上更新方式,只要合理,灵活的利用任务通知的特点,可以在一些场合中替代队列、信号量、事件标志组。

1.4、任务通知值状态

任务都有一个结构体:任务控制块TCB,存在两个结构体成员变量,如下图1:

图1

注意:uint32_t类型,用来表示通知值;uint8_t类型,用来表示通知状态;
 

1.5、任务通知状态

任务通知状态有3种取值,如下图2:

图2

 名称,任务未等待通知,含义:任务通知默认的初始化状态

 名称,等待通知,含义:接收方已准备好(此时已调用接收任务通知函数),等待发送方给通知

 名称,等待接收,含义:发送方已发送(此时已调用发送任务通知函数),等待接收方接收

1.6、任务通知方式类型

代码实现:

typedef enum
{
    eNoAction = 0,            /* Notify the task without updating its notify value. */
    eSetBits,                 /* Set bits in the task's notification value. */
    eIncrement,               /* Increment the task's notification value. */
    eSetValueWithOverwrite,   /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */
    eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */
} eNotifyAction;

参数含义:

名称,eNoAction ,含义:无操作

名称,eSetBits,含义:更新指定位

名称,eIncrement,含义:通知值+1

名称,eSetValueWithOverwrite,含义:覆写方式更新通知值

名称,eSetValueWithoutOverwrite ,含义:不覆写方式更新通知值

二、任务通知相关API函数

2.1、常用的发送通知API函数

如下图4:

 图4

2.2、带通知值的发送通知函数

代码实现:

BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,
                               UBaseType_t uxIndexToNotify,
                               uint32_t ulValue,
                               eNotifyAction eAction,
                               uint32_t * pulPreviousNotificationValue ) PRIVILEGED_FUNCTION;

参数含义:

名称,xTaskToNotify,含义:接收任务通知的任务句柄

名称,uxIndexToNotify,含义:任务的指定通知

名称,ulValue,含义:任务通知值

名称,eAction,含义:通知方式(通知值关系方式)

名称,pulPreviousNotificationValue ,含义:用于保存更新前的任务通知值(NULL不保存)

2.3、常用的接收通知API函数

函数名称:ulTaskNotifyTask()

作用:获取任务通知,可以设置在退出此函数时将任务通知值清零或-1;当任务通知用作二值信号量或计数信号量时,使用此函数获取信号量。

函数名称:xTaskNotifyWait()

作用:获取任务通知,比ulTaskNotifyTask更复杂,可获取通知值和清除通知值的指定位。

2.4、ulTaskGenericNotifyTake函数

代码实现:

#define ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ) \
    ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY ), ( xClearCountOnExit ), ( xTicksToWait ) )

参数含义:

名称,tskDEFAULT_INDEX_TO_NOTIFY ,含义:任务的指定通知

名称,xClearCountOnExit ,含义:指定任务在成功接收通知后,将通知值清零或-1;pdTRUE-->把通知值清零,pdFALSE-->把通知值-1

名称,xTicksToWait ,含义:阻塞等待任务通知值的最大时间

返回值含义:

返回,0,含义:接收失败

返回,非0,含义:接收成功,返回任务通知的通知值

2.5、xTaskGenericNotifyWait函数

代码实现:

#define xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \
    xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY, ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) )

参数含义:

名称,tskDEFAULT_INDEX_TO_NOTIFY,含义:任务的指定通知

名称,ulBitsToClearOnEntry ,含义:等待清零指定任务通知的比特位

名称,ulBitsToClearOnExit ,含义:成功等待后清零指定的任务通知值比特位

名称,pulNotificationValue ,含义:用来取出通知值(不使用设为NULL)

名称,xTicksToWait ,含义:阻塞等待任务通知值的最大时间

返回值含义:

返回,pdTRUE,含义:等待任务通知成功

返回,pdFALSE,含义:等待任务通知失败

注意:此函数用于获取通知值和清除通知值的指定位值,适用于模拟队列和事件标志组,使用该函数来获取任务。

2.6、最佳使用场合

        1)当任务通知用作信号量时,使用函数获取信号量:ulTaskNotifyTask()

        2)当任务通知用作事件标志组或队列时,使用函数来获取:xTaskNotifyWait()

猜你喜欢

转载自blog.csdn.net/qq_57663276/article/details/128994307
今日推荐