一、简介
1.1、开发环境
STM32CubeIDE V1.9,FreeRTOS CMSIS_V1。
1.2、摘要
FreeRTOS任务通知的API范例,编程时复制使用,把“Example"全部替换成所需名称,高效统一。
二、任务通知模拟信号量
2.1、头文件宏定义
接收任务通知的任务的宏定义:
void Example_Task(); //任务函数
#define EXAMPLE_TASK_NAME "EXAMPLE" //任务名
#define EXAMPLE_TASK_STACK_SIZE 64 //任务堆栈大小
#define EXAMPLE_TASK_PARAMETER NULL //任务参数
#define EXAMPLE_TASK_PRIORITY 30 //任务优先级
extern TaskHandle_t EXAMPLE_TASK_HANDLE; //任务句柄
#define EXAMPLE_TASK_NOTIFY_EXIT pdTRUE //任务通知退出方式
#define EXAMPLE_TASK_NOTIFY_WAIT_TICK portMAX_DELAY //任务通过等待时长
任务通知退出方式:pdFALSE,在退出ulTaskNotifyTake()的时候,任务通知值减1,类似计数型信号量;pdTRUE,退出ulTaskNotifyTake()的时候,任务通知值清零,类似二值信号量。
2.2、动态创建任务
工程文件(.c)添加以下定义任务句柄的语句:
TaskHandle_t EXAMPLE_TASK_HANDLE; //任务句柄
创建任务位置,加入以下语句:
xTaskCreate( //动态创建任务
(TaskFunction_t ) Example_Task, //任务函数
(char * ) EXAMPLE_TASK_NAME, //任务名
(uint16_t ) EXAMPLE_TASK_STACK_SIZE, //任务堆栈大小
(void * ) EXAMPLE_TASK_PARAMETER, //任务参数
(UBaseType_t ) EXAMPLE_TASK_PRIORITY, //任务优先级
(TaskHandle_t * ) &EXAMPLE_TASK_HANDLE ); //任务句柄
2.3、接收任务通知
Example_Task()任务如下:
void Example_Task() //任务函数
{
while(1)
{
if(ulTaskNotifyTake(EXAMPLE_TASK_NOTIFY_EXIT, EXAMPLE_TASK_NOTIFY_WAIT_TICK)) //等待接收任务通知
{
//此处填写处理语句
}
}
}
返回值:EXAMPLE_TASK_NOTIFY_EXIT为pdTRUE时,ulTaskNotifyTake()返回1;EXAMPLE_TASK_NOTIFY_EXIT为pdFALSE时,ulTaskNotifyTake()返回计数。
2.4、发送任务通知
任务级发送任务通知,使用以下语句:
xTaskNotifyGive(EXAMPLE_TASK_HANDLE); //发送任务通知
中断级发送任务通知,使用以下语句:
vTaskNotifyGiveFromISR(EXAMPLE_TASK_HANDLE, NULL); //发送任务通知
注:这两个函数,一个x开头,另一个v开头。