《时间触发嵌入式系统设计模式》-多任务程序设计思路
多个LED以不同频率运行程序变形
本文带你一步一步走进多任务,用非常接地气的方式带你了解多任务,无论是嵌入式小白还是入行多年嵌入式大牛都有一定的借鉴作用,接下来我们多种方法来实现三个LED灯以不同的频率闪烁
实验内容:黄色灯1Hz(500ms),蓝色灯2Hz(250ms),红色灯4Hz(125ms)
引脚关系:黄色灯->P0.0、蓝色灯->P0.1、红色灯->P0.2
方案一:在大循环中计数的方式
实验效果:

程序代码:main.c文件
main.h文件
LED.c文件
LED.h文件
实验按照我们预想的那样,实现了三个LED灯以不同频率闪烁;这个例子基本实现了多任务执行,任务执行的最小周期取决于我们的系统周期,像该例子中,系统周期就是5ms(200Hz);那么我们想要实现高于200Hz执行的任务可以修改系统延时SYSTEM_DELAY,参考LED闪烁的任务实现方式尝试添加其他任务 ,并验证实验效果。
思考:我们注意到while循环中用到了等待延时函数delay( SYSTEM_DELAY );,我们觉得这样还不够,有没有方法可以在main函数大循环中不用任何延时来实现不同频率LED灯的闪烁,大家可以短暂的思考下,带着对问题的思考我们一起来看下方案二的实现方式,或许会给你一些启发。

方案二:采用定时器
我们知道无论哪种单片机都有定时器,像高级一点的单片机还有专门的系统定时器(systick),比如说: STM32,那么同样是减法运算,我们把它放在在定时器中来进行操作
为了区别于方案1,我们把每个任务的周期改一下:
实验内容:黄色灯4Hz(125ms),蓝色灯2Hz(250ms),红色灯1Hz(500ms)
引脚关系:黄色灯->P0.0、蓝色灯->P0.1、红色灯->P0.2
定时器:我们这里选用T0,定时器周期计算参考宏晶公司提供的软件里面的示例代码,我们这里应为没有让定时器工作在1T状态,所以跟传统单片机是一样的操作方式。

实验效果

程序代码:main.c源文件
main.h头文件
LED灯部分的头文件和源文件没有改动,大家可以参考方案一的代码。
方案二多任务原理:采用定时器T0的1ms周期性中断操作来对每个任务要计时的量来进行减法运算,当减到零时,运行任务,然后再重新进行任务延时赋值。

总结:
1、两种多任务方案都能满足小规模嵌入式系统的要求,并且添加多个任务也非常方便
2、采用任务方式编写程序,我们更多的时候不是在写代码,而是在考虑如何让更多的代码可重复利用以及修改的方便性
3、方案二已经接近时间片轮询法系统雏形,可以移植到其他单片机上同样能使用
预告:接下来我们将对方案二中的多任务程序进行进一步改造,使之能适应不同功能需求,并且能方便的添加任务,从而达到我们对一个简单的多任务系统的要求,同时在接下来的讲解中还会牵涉到数据结构,我们也大可不必担心,因为只使用到了其中一部分数据结构,大家可以提前去预习下。
可能很多人在大学里面把数据结构学完,考试完都不清楚数据结构有些什么用途。
给大家推荐一本书,大家可以参考下:

同样的,还是希望大家多多支持正版书籍,每一本好书都值得你多次去阅读!!