FreeRTOS学习笔记-基于stm32(11)任务通知及相关API函数简介

一、什么是任务通知

        任务通知与队列,信号量,事件标志组类似,也是一种用于任务通信和同步的机制。

任务通知的优点:

        不用创建中间变量来传递数据,任务控制块中的成员变量 ulNotifiedValue 就是这个通知值;

        可以选择:不覆盖接收任务的通知值(如果上次发送给接收任务的通知还没被处理);覆盖接收任务的通知值(类似队列);更新接收任务通知值的一个或多个 bit(类似事件标志组);增加接收任务的通知值(类似信号量)。

任务通知的缺点:

        FreeRTOS 的任务通知只能有一个接收任务,其实大多数的应用都是这种情况;

        接收任务可以因为接收任务通知而进入阻塞态,但是发送任务不会因为任务通知发送失败而阻塞;

        在中断中不能接收通知,但可以发送,因为中断中没有任务控制块这个结构体。

二、任务发送相关API函数

函数描述
xTaskNotify()发送通知,带有通知值并且不保留接收任务原通知值,用在任务中
xTaskNotifyFromISR()发送通知,函数 xTaskNotify()的中断版本
xTaskNotifyGive()发送通知,不带通知值并且不保留接收任务的通知值,此 函数会将接收任务的通知值加一,用于任务中
vTaskNotifyGiveFromISR()发送通知,函数 xTaskNotifyGive()的中断版本
xTaskNotifyAndQuery()发送通知,带有通知值并且保留接收任务的原通知值,用在任务中
xTaskNotiryAndQueryFromISR()发送通知,函数 xTaskNotifyAndQuery()的中断版本,用在中断服务函数中

        xTaskNotify()、xTaskNotifyGive() 和 xTaskNotifyAndQuery(),这三个函数最终调用的都是函数 xTaskGenericNotify(),只是传入的参数不同。

BaseType_t xTaskGenericNotify(TaskHandle_t xTaskToNotify,              //任务句柄
                               uint32_t ulValue,                       //任务通知值
                               eNotifyAction eAction,                  //任务通知更新方式
                               uint32_t * pulPreviousNotificationValue)//保存更新前的任务通知值

1、函数 xTaskNotify():

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, 
                        uint32_t ulValue, 
                        eNotifyAction eAction )

        此函数用于发送任务通知,此函数发送任务通知的时候带有通知值。

        参数:xTaskToNotify:任务句柄,指定任务通知是发送给哪个任务的;

                   ulValue:任务通知值;

                   eAction:任务通知更新的方法,eNotifyAction 是个枚举类型,在文件 task.h 中有如下 定义:

typedef enum
{
    eNoAction = 0,
    eSetBits,                 //更新指定的 bit
    eIncrement,               //通知值加一
    eSetValueWithOverwrite,   //覆写的方式更新通知值
    eSetValueWithoutOverwrite //不覆写通知值
} eNotifyAction;

        返回值:pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 pdFAIL;

                      pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。

2、函数 xTaskNotifyGive():

BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );

        发送任务通知,不带通知值,此函数只是将任务通知值简单的加一。

        参数:xTaskToNotify:任务句柄,指定任务通知是发送给哪个任务的;

        返回值:pdPASS: 此函数只会返回 pdPASS。

3、函数 xTaskNotifyAndQuery():

BaseType_t xTaskNotifyAndQuery ( TaskHandle_t xTaskToNotify, 
                                 uint32_t ulValue, 
                                 eNotifyAction eAction 
                                 uint32_t * pulPreviousNotificationValue);

        与xTaskNotify()类似,仅多一个用来保存更新前的通知值的参数。

        参数: xTaskToNotify:任务句柄,指定任务通知是发送给哪个任务的;

                    ulValue:任务通知值;

                    eAction:任务通知更新的方法;

                    pulPreviousNotificationValue:用来保存更新前的任务通知值。

        返回值:pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 pdFAIL;

                      pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。

三、任务通知相关API函数

函数描述
ulTaskNotifyTake()获取任务通知,可以设置在退出此函数的时候将任务通知值清零 或者减一;当任务通知用作二值信号量或者计数信号量的时候使 用此函数来获取信号量
xTaskNotifyWait()等待任务通知,比 ulTaskNotifyTak()更为强大,全功能版任务通 知获取函数

1、函数 ulTaskNotifyTake():

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, 
                           TickType_t xTicksToWait );

        获取任务通知函数,当任务通知用作二值信号量或者计数型信号量的时候可以使用此函数来获取信号量。

        参数: xClearCountOnExit:参数为 pdFALSE 的话在退出函数 ulTaskNotifyTake()的时候任务通知值减一,类似计数型信号量;当此参数为 pdTRUE 的话在退出函数的时候任务任务通知值清零,类似二值信号量;

                    xTickToWait: 阻塞时间;

        返回值:任务通知值减少或者清零之前的值。

2、函数 xTaskNotifyWait():

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,
                            uint32_t ulBitsToClearOnExit, 
                            uint32_t * pulNotificationValue, 
                            TickType_t xTicksToWait );

        不管任务通知用作二值信号量、计数型信号量、队列和事件标志组中的哪一种,都可以使用此函数来获取任务通知。但是当任务通知用作位置信号量和计数型信号量的时候推荐使用函数 ulTaskNotifyTake()。

        参数:ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取反值进行按 位与运算,当此参数为 0xffffffff 或者 ULONG_MAX 的时候就会将任务通知值清零。                           ulBitsToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将任务通知值 与此参数的取反值进行按位与运算,当此参数为 0xffffffff 或者 ULONG_MAX 的时候就会将任务通知值清零。

                   pulNotificationValue:此参数用来保存任务通知值。

                   xTickToWait: 阻塞时间。

        返回值:pdTRUE:获取到了任务通知;

                      pdFALSE:任务通知获取失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值