FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能,每个任务都有一个 32 位的通知值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为 1的队列(可以保存一个 32 位整数或指针值)。
代替消息队列
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "limits.h"
void sent (){
uint32_t send2 = 2;
while(1)
{
/* 原型:BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction );
* eNoAction = 0,通知任务而不更新其通知值。
* eSetBits, 设置任务通知值中的位。
* eIncrement, 增加任务的通知值。
* eSetvaluewithoverwrite,覆盖当前通知
* eSetValueWithoutoverwrite 不覆盖当前通知
*
* pdFAIL:当参数eAction设置为eSetValueWithoutOverwrite的时候,
* 如果任务通知值没有更新成功就返回pdFAIL。
* pdPASS: eAction 设置为其他选项的时候统一返回pdPASS。
*/
xTaskNotify(app_handle,send2,eSetValueWithOverwrite );
}
}
void rec(){
int rec = 0;
while(1)
{
/* BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry,
uint32_t ulBitsToClearOnExit,
uint32_t *pulNotificationValue,
TickType_t xTicksToWait );
* ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取
反值进行按位与运算,当此参数为Oxfffff或者ULONG_MAX的时候就会将任务通知值清零。
* ulBits ToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将
任务通知值与此参数的取反值进行按位与运算,当此参数为0xfffff或者ULONG MAX的时候
就会将任务通知值清零。
* pulNotification Value:此参数用来保存任务通知值。
* xTick ToWait:阻塞时间。
*
* 返回值:pdTRUE:获取到了任务通知。pdFALSE:任务通知获取失败。
*/
//获取任务通知 ,没获取到则一直等待
xTaskNotifyWait(0x00,ULONG_MAX,&rec,portMAX_DELAY);
}
}
代替二值信号量
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "limits.h"
void sent (){
uint32_t send2 = 2;
while(1)
{
/* 原型:BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); */
/* 释放一个任务通知 */
xTaskNotifyGive(app_handle);
}
}
void rec(){
int rec = 0;
while(1)
{
/* uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
* xClearCountOnExit:pdTRUE 在退出函数的时候任务任务通知值清零,类似二值信号量
* : pdFALSE 在退出函数ulTaskNotifyTakeO的时候任务通知值减一,类似计数型信号量。
*/
ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
}
}
代替计数信号
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "limits.h"
void sent (){
uint32_t send2 = 2;
while(1)
{
/* 原型:BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); */
/* 释放一个任务通知 */
xTaskNotifyGive(app_handle);
}
}
void rec(){
int rec = 0;
while(1)
{
/* uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
* xClearCountOnExit:pdTRUE 在退出函数的时候任务任务通知值清零,类似二值信号量
* : pdFALSE 在退出函数ulTaskNotifyTakeO的时候任务通知值减一,类似计数型信号量。
*/
take_num=ulTaskNotifyTake(pdFALSE,0);
if(take_num > 0){
}
}
}
代替事件
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "limits.h"
#define KEY1_EVENT (0x01 << 0)//设置事件掩码的位0
#define KEY2_EVENT (0x01 << 1)//设置事件掩码的位1
void sent (){
uint32_t send2 = 2;
while(1)
{
/* 原型:BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction );
* eNoAction = 0,通知任务而不更新其通知值。
* eSetBits, 设置任务通知值中的位。
* eIncrement, 增加任务的通知值。
* eSetvaluewithoverwrite,覆盖当前通知
* eSetValueWithoutoverwrite 不覆盖当前通知
*
* pdFAIL:当参数eAction设置为eSetValueWithoutOverwrite的时候,
* 如果任务通知值没有更新成功就返回pdFAIL。
* pdPASS: eAction 设置为其他选项的时候统一返回pdPASS。
*/
/* 触发一个事件1 */
xTaskNotify((app_handle,KEY1_EVENT,eSetBits);
}
}
void rec(){
int rec = 0;
while(1)
{
/* BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry,
uint32_t ulBitsToClearOnExit,
uint32_t *pulNotificationValue,
TickType_t xTicksToWait );
* ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取
反值进行按位与运算,当此参数为Oxfffff或者ULONG_MAX的时候就会将任务通知值清零。
* ulBits ToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将
任务通知值与此参数的取反值进行按位与运算,当此参数为0xfffff或者ULONG MAX的时候
就会将任务通知值清零。
* pulNotification Value:此参数用来保存任务通知值。
* xTick ToWait:阻塞时间。
*
* 返回值:pdTRUE:获取到了任务通知。pdFALSE:任务通知获取失败。
*/
//获取任务通知 ,没获取到则一直等待
xTaskNotifyWait(0x00,ULONG_MAX,&rec,portMAX_DELAY);
}
}