FreeRTOS进阶-任务管理实践

实验目录:实验一和二  -> 动态/静态创建任务

                  实验三         -> 任务参数的使用

                  实验四         -> 任务删除

                  实验五         -> 任务优先级

                  实验六         -> 任务挂起与恢复

一、使用接口函数创建任务 

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值