一、任务的核心要素:函数、栈、优先级
- 做何事:函数
- 每个任务都有自己独享的栈(TCB和栈可以malloc动态分配,也可以事先静态分配)
- 扩展:优先级
1、TCB简介:
任务被切换出去之后,要再次找到该任务的步骤:
从某个链表中找到任务A。。。
链表中存放任务结构体TCB
2、动态分配和静态分配创建任务
可以静态或者动态分配,所以对应两套函数。
静态:事先准备好栈和结构体
动态:动态分配栈和TCB结构体
3、创建任务——声光色影
freertos.c创建默认任务
只用了栈的大小,没有分配内存空间,用到的是动态分配
driver_ir_receiver.c遥控接收控制函数
freertos.c创建新任务——声(动态分配)
1、任务句柄
2、创建任务
3、分辨返回值
freertos.c创建新任务——光(静态分配)
1、函数类型
2、通过数组给函数提供栈buffer
PS:仅代表首地址,故还需在创建任务时指定数组长度;
3、静态分配任务结构体指针
4、任务创建
5、返回句柄
freertos.c创建新任务——色
函数、栈buffer、结构体指针TCB
freertos.c创建新任务——影
4、估算栈的大小
栈用来保存返回地址和其他寄存器、局部变量和保存现场
可以选取最复杂的调用关系来评估栈的大小
如对于一个5级调用来说,要用36字节来保存:
栈的示意图如下:
*以声音播放举例估计栈的大小:
5、使用任务参数
实现让同一个函数,创建不同的任务,通过不同的任务参数,让这些任务执行不同的操作
- 不同任务的栈不同,那么生成的局部变量就有各自的版本
- 如果两个任务访问的是全局变量,就要考虑互斥
1、LCD打印函数(可传递不同的参数)
函数参数 (在不同位置打印)
2、使用全局变量来避免打印过程中被打断导致的乱序
避免打印过程所占比例过大,导致切换到的全局变量为0(LCD被某一任务大比例的占用),所以加入时间延迟
6、删除任务
在默认创建任务的函数中实现音乐播放任务的创建和删除
PS:句柄和返回值的定义
点删除任务后,蜂鸣器保持一个音调,需加上停止蜂鸣器函数
Q:频繁的创建、删除任务好吗?有什么坏处
1、频繁的创建删除容易形成内存碎片
2、删除任务后还需要关闭蜂鸣器,需要后续的清理操作
一般在同一个任务中,通过按键实现蜂鸣器的开启和关闭,而不是使能蜂鸣器的开启任务和删除蜂鸣器 的开启任务
7、改善播放效果
(1)提高播放任务的优先级
- 提高优先级方法:在创建任务时,把播放音乐任务的优先级加1 ;
- 存在的问题:优先级高的任务在收到遥控器传来的信号后没有主动放弃CPU资源;
- 会影响到其他任务当用遥控启动任务后,其他任务不再执行。
(2)使用vTaskDelay改进延迟:
vTaskDelay在延迟的过程中不参与调度
既保持了播放效果,同时也不影响其他任务