论嵌入式单片机软件架构


这注定是一篇耗时很长的文章,做个标记,文章始于2019年1月8日,不知何时完结。
为什么会想到写这篇文章呢?
因为作为一个从单片机汇编语言开始,到单片机C编程、再到ARM实时操作系统、一步一步摸爬滚打走到Linux世界的嵌入式软件工程师,也有十二年了;而今主要在Linux环境下写嵌入式软件,我不想把单片机领域积累的知识就此慢慢遗忘,遂决定把我以往的知识做一下总结,提炼到一篇文章当中,这不是一件容易的事;写到这里,以下都不知从何写起,待我构思几天吧…

经过几天的回忆与思考,分析了我的成长路径,选择一些我自认为是成长关键点的位置,总结一个关键字,一步一步来讨论关于嵌入式单片机软件的架构。
我先把总结出的关键字写出来吧:流水式、中断前后台、任务式、状态机、模块、分层、封装,操作系统多任务;这些就是我总结出的关键字,写这篇博客我决定不参照其他博客,只把我心中所想以及以前的代码示例或者记录翻出来,再加修改,然后呈现出来,供大家品鉴。

下面就从我的第一份工作说起吧。

流水式

我的第一份工作是从PIC单片机开始的,使用汇编语言;当时刚刚毕业,在学校学的是51单片机,毕业设计使用51单片机做一个飞利浦的RC50013.56MHz的读卡器,那时对编程还处于朦胧状态,不存在架构的思想,就是按照功能一步一步的写。

所谓流水式,就是按照工作的流程一步一步实现,直到完成流程内的所有事情,最后再回到起始,从头开始。我用这样的思想写的第一份代码,是控制一个双向交流电机平移门,平移门就是开门与关门。流程如下:
在这里插入图片描述
由以上流程可以看出,我的代码就是按照这个流程一步一步堆砌出来的,哪里来的编程思想,这样的程序有哪些缺点呢?

  1. 会有很多位置检测相同的信号,例如遥控信号、限位限号
  2. 有多个位置执行电机控制动作
  3. 每次用软件信号抖动,都是直接的硬延时(所谓硬延时就是,直接delay,在delay过程中什么也不做)
  4. 在控制电机的过程不好扩展,功能也不好扩展(还好当时功能也比较简单)

这种简单的工作流代码堆砌,没什么好说的,工作流越长,逻辑越多,程序的分支越多,代码堆砌的越长。
呵呵,我这个代码可是配合硬件卖了一千多套呢!

中断前后台式

后来经过学习,接触到了中断与前后台编程方法;可是有的人说中断是前台,主程序是后台;有的人说中断是后台,主程序是前台;其实我觉得无所谓前台与后台;主要是程序被分为了顺序循环与异步中断两部分。那么就以我理解的前后台与中断来说一说吧。

  • 前台:程序主循环,除去while(1)前面必要的初始化部分外,主循环内完成程序的业务逻辑;至于如何完成业务逻辑、业务逻辑上有哪些是需要一些触发点、需要什么事件来推动业务逻辑的执行等,可由后台中断部分来设置触发条件、事件等。
  • 后台中断:由于中断的特点,发生时间是未知的,例如按键、遥控信号等;无法预知在什么时候发生,但它却是推动业务执行触发点。
  • 典型的由中断配合定时器可以很好地解决按键消抖问题,在按键按下产生中断后,设置并启动一个定时器,在定时器中断里面再次检测按键的值是否一样,就可进行抖动消除,同时又不占用主程序的执行时间。

举一个电机控制上例子:直流电机的软启动。什么叫软启动呢?直流电机在启动时,若直接给出额定电压,由于电机启动的瞬间属于堵转状态,会有很大的电流尖峰,有可能造成MOS烧坏,所以可以在电机启动时,不直接给出全部的电压,而是从%60的电压开始,经过一点时间慢慢抬升到额定电压(假设时间为0.5S);这也称为PWM调速。
要做到这样,需要在MOS管的驱动端给出PWM信号,这样的程序逻辑怎么由前后台完成呢?

  1. 首先前台主循环检测到电机启动触发信号之后,先设置电机的工作状态,同时开启一个PWM定时器,只不过此时PWM的初始占空比为%60。到此前台要做的事情就完毕了。
  2. 后台定时器中断,假设定时器中断为1ms,每1ms产生一次中断,向PWM定时器写入新的值,提高PWM占空比,直到在500ms处将占空比提高到%100,电机全速运行。

整个过程,前台主循环只负责将定时器开启,不具体执行电机的控制动作,剩下的电机开启以及PWM调速全部都在中断里完成。

有的人说,在中断里不能做的很复杂,不能做耗时很长的事情,基本上说的没错,但是有一些应用却并不如此,例如使用MSP430系列单片机完成超低功耗应用,主程序就是休眠的,在中断里完成业务逻辑也是可以的。

随着程序的功能越来越多,逻辑越来越复杂,简单的前后台也不足以胜任,但是以后的软件框架都要基于前后台,不可能再次脱离此结构,只不过在程序主循环与中断上做的文章也越来越多而已。

任务式

当嵌入式系统的功能越来越多,我们肯定不想把所有的代码全部都简单堆积在while(1)中,超过500行的代码,简直都没法阅读,逻辑也不清晰;因此我们会想,程序都有哪些功能呢,能不能把保业务逻辑分一分,哪些事情是相对独立的,划分出不同的任务来,由这些任务组合去完成整体的功能。
假设一个小型的嵌入式系统有以下功能:

  • 液晶显示(点整或段式液晶):显示数据内容、参数等信息
  • 控制操作:执行电机控制、继电器的开关等操作
  • 按键菜单:操作按键,在液晶上显示菜单、修改参数等
  • 数据存储:存储必要的运行参数、用户信息等
  • 命令接收与处理:接收串口的命令,处理后恢复,并根据相应的命令执行
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值