实验目录:实验一和二 -> 动态/静态创建任务
实验三 -> 任务参数的使用
实验四 -> 任务删除
实验五 -> 任务优先级
实验六 -> 任务挂起与恢复
一、使用接口函数创建任务
1.动态创建 xTaskCreate()
函数原型:
BaseType_t xTaskCreate(
TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,
单位为word(字),1字=4字节(在32位MCU)
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务
2.静态创建 xTaskCreateStatic()
函数原型:
TaskHandle_t xTaskCreateStatic (
TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const uint32_t ulStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
StackType_t * const puxStackBuffer, // 静态分配的栈,就是一个buffer
StaticTask_t * const pxTaskBuffer // 静态分配的任务结构体的指针,用它来操作这个任务
);
3.任务删除 vTaskDelete
函数原型:
void vTaskDelete( TaskHandle_t xTaskToDelete );//填入任务的句柄,删除任务
在任务中:删除自身
vTaskDelete( NULL )
删除其他任务 vTaskDelete( 任务句柄)
4.任务挂起与恢复 vTaskSuspend 和 vTaskResume
函数原型:
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
要退出暂停状态,只能由
别人
来操作:
别的任务调用:vTaskResume
中断程序调用:xTaskResumeFromISR
二、
实验1-任务创建
内容:创建两个任务,分别运行LED任务和OLED显示屏任务
(1)在系统默认创建的任务中初始化LCD(OLED),并循环运行LCD_Test()
(2)使用动态创建任务,在MX_FREERTOS_Init(void)中,调用xTaskCreate()创建Led任务
//依次分别为:任务函数,任务名,栈大小,任务函数传入形参,优先级,句柄
xTaskCreate(MyTask, "myfirsttask", 128, NULL, osPriorityNormal, NULL);
三、
实验2-任务创建"声、光、色、影"
内容:(1)动态创建任务"声",使用无源蜂鸣器播放音乐
(2)静态创建任务"光",LED灯闪烁
(3)静态创建任务"色",全彩LED渐变颜色
(4)Freertos默认任务,在默认任务中检测红外遥控器的键值并显示在OLED上
1.PlayMusic任务:PlayMusic
在music.c中(文件路径:../Core/Src)
2.LED任务:Led_Test
在静态创建时,我们直接将函数LedTest作为任务函数,不再另外编写,如图:
此处报警:warning: #167-D: argument of type "void (*)(void)" is incompatible with parameter of type "TaskFunction_t" {TaskFunction_t 是 void (*)(void)型,类型不匹配,但是不影响调用 }
3.全彩LED任务:ColorLED_Test
在静态创建时,我们直接将函数ColorLED_Test作为任务函数,不再另外编写,如图:
4.OLED任务:StartDefaultTask
四、
实验3-使用任务参数
内容:(1)创建保存形参的结构体TaskPrintInfo
(2)使用同一个函数创建不同的任务
(3)编写任务函数LcdPrintTask
(4)配置形参结构体"g_Task?Info"
1.创建结构体
2.动态创建任务1、2、3
3.任务函数LcdPrintTask
4.任务参数设置
五、
实验4-任务删除
内容:(1)defaultTaskHandle 中初始化OLED和红外遥控
(2)读取红外遥控,不同的键值对应不同的功能
(3)编写服务函数逻辑 "0xa8":创建播放音乐任务,"0xa2":删除任务
六、
实验5-任务优先级
目的:优化音乐播放的卡顿
内容:(1)在创建任务的同时,修改任务优先级(数值大,优先级高)
(2)使用xTaskDelay函数延时,任务进入阻塞态,程序并不会死等,在这段时间会执行其他 任务
若不修改,任务卡死,无法通过按键删除任务
6、
实验5-任务恢复与挂起
目的:实现暂停音乐播放,在暂停处恢复播放
内容:(1)在创建任务的同时,增加任务状态标志位bRunning(0:暂停,1:运行)
(2)当bRunning=1,调用vTaskSuspend挂起任务,bRunning置0,
否则再次按下"play",调用vTaskResume恢复任务,将bRunning置1