欢迎光临散文网 会员登陆 & 注册

《时间触发嵌入式系统设计模式》-多任务程序设计思路

2021-06-28 23:43 作者:想啥_做啥  | 我要投稿

多个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状态,所以跟传统单片机是一样的操作方式。

T0中断时间计算

实验效果

程序代码:main.c源文件

main.h头文件

LED灯部分的头文件和源文件没有改动,大家可以参考方案一的代码。

方案二多任务原理:采用定时器T0的1ms周期性中断操作来对每个任务要计时的量来进行减法运算,当减到零时,运行任务,然后再重新进行任务延时赋值。

总结:

1、两种多任务方案都能满足小规模嵌入式系统的要求,并且添加多个任务也非常方便

2、采用任务方式编写程序,我们更多的时候不是在写代码,而是在考虑如何让更多的代码可重复利用以及修改的方便性

3、方案二已经接近时间片轮询法系统雏形,可以移植到其他单片机上同样能使用

预告:接下来我们将对方案二中的多任务程序进行进一步改造,使之能适应不同功能需求,并且能方便的添加任务,从而达到我们对一个简单的多任务系统的要求,同时在接下来的讲解中还会牵涉到数据结构,我们也大可不必担心,因为只使用到了其中一部分数据结构,大家可以提前去预习下。

可能很多人在大学里面把数据结构学完,考试完都不清楚数据结构有些什么用途。

给大家推荐一本书,大家可以参考下:

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


《时间触发嵌入式系统设计模式》-多任务程序设计思路的评论 (共 条)

分享到微博请遵守国家法律