本集接续上集,讲解如何在实际项目中应用定时器解决问题。
目标是周期性执行3个任务。如下:
- 任务1:用一个定时器实现,LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次。
- 任务2:数组点亮LED,实现流水灯。
- 任务3:按键1按一下,LED通过数组移动一下等。
这三个任务并行执行,在时间序列上存在交叉重叠,完成这个任务就必须把定时器派上用场。
因为任务多了,代码量也上了。如果全部写在一个主文件上,行数太多,逻辑不清,难以维护。
冲哥在这一集讲解了代码分拆,多文件管理。非常值得学习,在以后的项目应用中多是这种情况。
代码按功能进行了拆分:
- 主模块 main.c 主要执行主循环
- 定时器的配置等工作拆分到了 config.c
- Led显示和按键处理拆分到了 io.c
- 任务的处理给了 task.c
本讲重点讲解了多任务的执行,核心就在任务的安排中,task.c 代码片断,这是一个结构数组
static TASK_COMPONENTS Task_Comps[]=
{
//状态 计数 周期 函数
{0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms */
{0, 600, 600, LED1_Blink}, /* task 1 Period: 600ms */
{0, 900, 900, LED2_Blink}, /* task 1 Period: 600ms */
{0, 10, 10, KEY_Task}, /* task 1 Period: 600ms */
};
主模块通过任务回调来循环执行任务数组
