读《时间触发嵌入式系统设计模式》一书谈谈个人对嵌入式编程的一些理解

入门阶段

图片来自百度

这个阶段,我们最常用的程序结构基本都是这种while大循环结构,实现的功能主要以单任务为主,因为我们大部分时间都是在学习单片机本身的资源如何使用(I/O, I2C, SPI, 串口),嵌入式开发工具环境搭建(Keil软件,ISP下载软件),C语言基础以及单片机如何配合外部设备(按键,数码管、LED灯、1602,12864显示器,时钟芯片,光电传感器、电机驱动模块)来实现我们一些想要的功能,我们的程序也相对来说比较简单。
典型的点亮一颗LED灯程序结构

书中前面1~8章主要是介绍这些软件的一些基本的概念和基础的硬件知识

进阶阶段

来自百度图片

有了入门阶段的知识积累,我们对单片机有了一个全新的认识,迫不及待的想通过单片机实现一些更复杂、更炫酷的功能;在这个过程中我们慢慢的发现,原有的程序结构很难满足我们的程序开发需求,可能用按键控制LED灯亮灭问题不是太大,我们想想办法基本都能实现相应功能。
按键控制LED灯程序结构

但是像下面的一个典型的电子钟:要实现按键的输入,又要控制数码管的以一定的频率(>50Hz)刷新,同时还要以一定的周期与时钟芯片通信以及控制蜂鸣器声音,用原有的大循环也是能实现,但是我们需要耗费大量的精力在各模块之间如何配合,带来的程序可移植性也很差。
一个典型的电子钟程序结构

书中还特意举了洗衣机的例子,这是一个有多个输入,同时有多个输出控制的程序,很多输入输出都是随机的,但是你又不能错过,不然整个洗衣机的体验会很差,当然作者也给出了解决思路
书中提到的洗衣机控制框图

下图是贯穿全书核心思想的程序结构
贯穿全书的程序结构

使用这种方式来设计程序,也对我们自身的知识储备提了一些要求,要掌握模块化式的文件如何编写,这种模块化的思想不关是在程序设计中应用非常广泛,在各行各业中应用同样广泛,我个人觉得其核心思想就是,所有东西都是由零部件组成,这些零部件是可以"标准化"的,理解这种思想对我们从事嵌入式行业的人员来说是非常重要的,一方面会为你节约大量时间,另一方面你所储备的"标准模块"在不断的累加,你会有更多的时间去考虑更高层次的东西,久而久之就成为这个行业的专家,无论你是从事技术岗位还是以后想走向管理岗位都是非常有用的。
汽车底盘结构(摘自搜狐)

汽车剖视图(摘自搜狐)

第9章主要就是介绍这种模块化方面的软件体系结构方面的内容,就算不了解时间触发式系统设计模式里面的调度器设计思路,在原来大循环程序的基础上也是可以运用这种模块化的程序设计思路,比如:将LED灯亮灭程序拆解成LED显示模块主函数模块
main.c文件

模块.h文件

模块.c文件

对于多任务,我们可能会想到使用定时器的溢出中断来解决这方面的问题,作者也尝试着运用这种方式来解决,比如说我们51单片机有三个定时器,我们可以通过配置每个定时器的中断周期来实现不同周期任务的执
使用多个定时器中断实现多任务

书中提到的多个定时器执行多任务方式

显然对于复杂的系统,我们不止这么几个任务,并且我们的单片机定时器资源都是有限的,那么对于复杂的多任务处理显然是不合适的,这个时候,书中开始给出调度器的方案来解决这方面的问题。
一个基本的调度器原型

像我在平时写嵌入式程序的过程中,一般使用的是时间片轮询方式,前几天在抖音上看到有一个哥们也是用的这种方式设计程序,我在深圳工作那会儿,公司里也有人用这种方式书写程序,至于该书中提到的调度器(合作式,抢占式),大家可以先自行去理解下,后期我会专门来分析这些优秀的调度器
时间片轮询方式程序结构

这种方式的核心思想就是用一个定时器来产生基准的时间,根据具体的任务来定,我一般使用1ms周期产生定时中断,然后给每个任务定义一个任务延时变量,初始化后在定时器中不断的做减法运算,当减到0时,改变相应的任务状态标志,任务执行过程中又重新对任务状态标志任务延时变量进行初始化,其他任务也是同样的操作;这个定时器就如同我们公司领导一样,不断的以一定的周期给我们指派任务,然后让我们去执行。
图片来源于百度

写在最后

顺便给大家提供几本优秀的嵌入式书籍,大家可以参考下

图片来源于百度

《时间触发式嵌入式系统设计模式》一书作者也提到,全书讲的是一种设计模式,这种设计模式不局限于具体单片机(51,STM32,PIC包括arduino都可以用),整个软件行业的发展我个人觉的其实都是在不断的减轻设计者、开发工程师的工作量,把那些反复需要做的工作都交给软件工具或者说优秀的软件框架来做,从汇编语言到C语言在到后面的C++语言,python语言,软件本身的易用性在不断的得到改善,随着科学技术的进步以及越来越多的厂商打造的生态以及众多的优秀嵌入软件设计思路的提出,以后的嵌入式软件开发方式跟现在的windows程序和android程序开发基本没什么区别,更有甚直接采用拖框图的方式开发(matlab基于模型的开发方式)。
《时间触发嵌入式系统设计模式》书籍连接
https://pan.baidu.com/link/zhihu/7FhlzNuVhHijVVpGdVVKlHxkUGYYxESwZvp2==

像这个网站提供的又是另外一种基于状态机思路的嵌入式软件开发方式,代码都是开源的,感兴趣的小伙伴可以去看看 https://www.state-machine.com/

图片来源于state-machine官网截图

这里也有官网提供的一本书,可以在官网下载阅读

https://pan.baidu.com/link/zhihu/7hhlzduZhMimQKBjVDcxE3I0dfMvFVUwZERX==

模块化式软件设计思路可以参考这本书《嵌入式系统构件》,作者是jean j.labrosse,uCOS的创作者,国内很多嵌入式实时系统的开发者都是启蒙于这位大佬,这本里面讲的是模块化式的设计思路,主要是为uCOSII提供的配套,但是可以移植到非uCOS系统的嵌入式工程中,里面提供了很多有效且已经项目验证的模块化文件,比如说输入输出模块,多功能按键,数码管驱动,串口通信等,这些模块的设计思路对我们实际项目开发非常有用,希望对大家有借鉴作用。
https://pan.baidu.com/link/zhihu/7ghlzMuVhzi2NVhGdkZP5CNEdRQ6lnaQQ1ZU==


为了更好的支持原创作者和翻译作者,大家可以根据自身的实际情况支持下,这样以便于让更多优秀作者投身其中创作更多优秀作品

你可能感兴趣的:(读《时间触发嵌入式系统设计模式》一书谈谈个人对嵌入式编程的一些理解)