学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。
注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。
后续文章会同时发表在个人博客(jason1016.club)、CSDN;
视频会发布在bilibili(UID:399951374)
一、概念
FreeRTOS 新增了任务通知(Task Notifictions)这个功能,可以使用任务通知来代替信号量、消息队列、事件标志组等这些东西。
#define configUSE_TASK_NOTIFICATIONS 1 //为1时开启任务通知功能,默认开启
任务通知是一个事件,假如某个任务通知的接收任务因为等待任务通知而阻塞的话,向这个接收任务发送任务通知以后就会解除这个任务的阻塞状态。也可以更新接收任务的任务通知值,任务通知可以通过如下方法更新接收任务的通知值:
● 不覆盖接收任务的通知值(如果上次发送给接收任务的通知还没被处理)。
限制条件:
● FreeRTOS 的任务通知只能有一个接收任务,其实大多数的应用都是这种情况。
二、发送任务通知
/* ***************************任务级*************************************************************************** */
//可简单替代队列操作或事件标志组 xTaskNotify() 带有通知值并且不保留接收任务原通知值
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
uint32_t ulValue, //ulValue: 任务通知值。
eNotifyAction eAction ) //eAction: 任务通知更新的方法,eNotifyAction 是个枚举类型,在文件 task.h 中有如下定义:
typedef enum
{eNoAction = 0,
eSetBits, //更新指定的 bit
eIncrement, //通知值加一
eSetValueWithOverwrite, //覆写的方式更新通知值
eSetValueWithoutOverwrite //不覆写通知值
} eNotifyAction;
此参数可以选择枚举类型中的任意一个,不同的应用环境其选择也不同。
/*返回值:
pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回
pdFAIL。pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。*/
//可替代二值信号量以及计数信号量 xTaskNotifyGive() 不带通知值并且不保留接收任务的通知值,此函数会将接收任务的通知值加一
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
/*返回值:
pdPASS: 此函数只会返回 pdPASS。*/
// xTaskNotifyAndQuery() 带有通知值并且保留接收任务的原通知值
BaseType_t xTaskNotifyAndQuery ( TaskHandle_t xTaskToNotify, //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
uint32_t ulValue, //ulValue: 任务通知值。
eNotifyAction eAction, //eAction: 任务通知更新的方法。
uint32_t * pulPreviousNotificationValue); //pulPreviousNotificationValue:用来保存更新前的任务通知值。
/*返回值:
pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回
pdFAIL。pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。*/
/* ***************************中断级****************************************************************************** */
// xTaskNotifyFromISR() 带有通知值并且不保留接收任务原通知值
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
uint32_t ulValue, //ulValue: 任务通知值。
eNotifyAction eAction //eAction: 任务通知更新的方法,定义参考上述
BaseType_t * pxHigherPriorityTaskWoken ); //pxHigherPriorityTaskWoken: 记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:
pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回
pdFAIL。pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。*/
// vTaskNotifyGiveFromISR() 不带通知值并且不保留接收任务的通知值,此函数会将接收任务的通知值加一
BaseType_t vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
BaseType_t * pxHigherPriorityTaskWoken );//pxHigherPriorityTaskWoken: 记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:无*/
// xTaskNotifyAndQueryFromISR() 带有通知值并且保留接收任务的原通知值
BaseType_t xTaskNotiryAndQueryFromISR ( TaskHandle_t xTaskToNotify, //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
uint32_t ulValue, //ulValue: 任务通知值。
eNotifyAction eAction, //eAction: 任务通知更新的方法。
uint32_t * pulPreviousNotificationValue, //pulPreviousNotificationValue:用来保存更新前的任务通知值。
BaseType_t * pxHigherPriorityTaskWoken ); //pxHigherPriorityTaskWoken: 记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:
pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回
pdFAIL。pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。*/
三、获取任务通知
//函数:ulTaskNotifyTake() //获取任务通知,可以设置在退出此函数的时候将任务通知值清零或者减一。当任务通知用作二值信号量或者计数信号量的时候使用此函数来获取信号量。
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, //xClearCountOnExit: 参数为 pdFALSE 的话在退出函数 ulTaskNotifyTake()的时候任务通知值减一,类似计数型信号量。当此参数为 pdTRUE 的话在退出函数的时候任务任务通知值清零,类似二值信号量。
TickType_t xTicksToWait ); //xTickToWait: 阻塞时间。
/*返回值:任何值 : 任务通知值减少或者清零之前的值。*/
//函数:xTaskNotifyWait() //等待任务通知,比 ulTaskNotifyTak()更为强大,全功能版任务通知获取函数。
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, //ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取反值进行按位与运算,当此参数为 0xffffffff 或者 ULONG_MAX 的时候就会将任务通知值清零。
uint32_t ulBitsToClearOnExit, //ulBitsToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将任务通知值与此参数的取反值进行按位与运算,当此参数为 0xffffffff 或者ULONG_MAX 的时候就会将任务通知值清零。
uint32_t * pulNotificationValue, //pulNotificationValue:此参数用来保存任务通知值。
TickType_t xTicksToWait ); //xTickToWait: 阻塞时间。
/*返回值:
pdTRUE: 获取到了任务通知。
pdFALSE: 任务通知获取失败。*/