嵌入式软件开发专业-瀑布式开发和敏捷开发
点击左上角蓝色的“mixed Linux”,选择“设为星标”
第一次看干货
1个
在嵌入式软件开发中,包括单片机开发中,软件架构是开发人员必须认真考虑的问题。 软件架构对系统的整体稳定性和可靠性非常重要。 一个合适的软件架构不仅结构清晰,而且易于开发。
相信在早期的嵌入式或者单片机软件开发中,大部分开发者都是采用简单的前后端顺序执行架构(我就是这样做的)。
在嵌入式软件开发中,程序架构主要分为三种类型。 本文将详细讲解这三种程序架构。
一、软件架构的意义
可以说,一个好的程序架构是经验丰富的工程师和新手之间的分水岭。
软件架构对开发者友好。 你想先执行什么任务,然后执行什么任务,或者这个时间点执行什么任务嵌入式软件开发专业,或者某个任务会同步什么事件等等,在不同的软件架构下,具体方法解决上述问题的方法各不相同。
软件架构对开发者最大的帮助是:
帮助开发者把控整个项目的框架。 当您熟练使用其中一种程序框架后,您将能够快速定位和解决系统中的错误。
当然我建议大家根据自己的需要选择合适的软件架构进行开发。 具体原因会在文章后面介绍。
2. 三种不同程序架构的深入介绍
三种常用的软件架构是:顺序执行的前端和后端系统、时间片轮询系统和多任务操作系统。
为了让大家有一个更清晰的认识,我用三种软件架构来举例介绍一下。 本例如下:
它有4个任务,这4个任务分别是按键扫描、声光报警、显示屏刷新和超声波测距。 本例的具体功能是通过按键设置测量距离的阈值。 当距离低于设定的阈值时,会触发声光报警,测量距离会实时显示在显示屏上(本应用为汽车倒车雷达的具体体现)。
2.1 顺序执行的前后端系统 在顺序执行的前后端系统中,我将键盘扫描放在while(1)中以查询方式,同时屏幕刷新和超声波测距使用interrupts,在中断服务函数中获取,测距后显示,在main函数的循环中检测按键,声光处理也放在主循环中。 这样,整个程序在主循环和后台中断中以变量标志同步的方式执行,对应的程序代码如图所示:
▲依次执行前后端系统的主要功能
▲依次执行前后台系统的中断服务函数
这种架构的优点是简单易用,容易理解,缺点是如果每个任务占用的CPU时间过长,会导致程序实时性差,比如关键检测。
2.2 时间片轮询系统
时间片轮询方式其实通常出现在操作系统中,也就是说属于操作系统,但这里说的是基于前后台的时间片轮询。 时间片轮询方式的本质是选择一个定时器,在没有计划中断的情况下递增计数值,并在主循环中根据这个计数值执行任务。 这个计数值也是任务轮询的时间片。
本例中,如果采用时间片轮询系统,首先选择主控芯片的任意一个定时器,定时器的计时周期由我们决定。 为了保证实时性和运行效率,这个值通常取10ms、30ms、50ms等,我将按键扫描旋转值设置为20ms,因为按键晃动的持续时间一般为20ms,这样处理可以达到消除抖动的目的,不会遗漏按键的检测; 并且显示刷新设置为30ms,如果觉得刷新响应慢,也可以修改这个轮询值来改善;
超声波测距的轮询值设置为100ms,即每100个模式触发一次测距,这个测距频率已经可以满足大部分情况。
程序代码如下:
▲时间片轮询系统功能
▲时间片轮询系统的定时器中断函数
可见,时间片轮询的方式比顺序执行有很大的优势。 它既有顺序执行的优点,也有操作系统的一些优点。
2.3 多任务操作系统
操作系统本身就是一个比较复杂的东西,底层的任务管理和调度是非常复杂和困难的。 但是,我们一般把操作系统本身看成一个工具,一个平台,我们的目的是使用它的功能,而不是开发一个操作系统。
我用过ucos和freertos小型实时操作系统,也用过linux大型操作系统。 有了操作系统,无论是程序的稳定性,还是开发的效率都会好很多。 我们在使用操作系统的时候,需要学习和了解它的一些调度和通信方式。
其实,真正会用操作系统的人并不多。 相反,大多数在裸机上运行。 这也与产品的具体要求有关。 很多简单的系统只需要裸机就可以满足。
这里就不过多介绍操作系统本身了,因为操作系统确实相当复杂。 下图中的代码是在freertos中创建一个程序结构来控制LED的亮灭。 你可以比较一下:
▲freertos多任务系统中的主要功能
▲freertos多任务操作系统中的任务回调函数
3、如何选择合适的软件架构
项目开发使用过各种不同的MCU,如:STM32、STC15、Nuvoton等,也接触过复杂的设计需求,如:车载智能系统、智能家居,运行过操作系统等如ucos、freertos和Linux等。回到裸机开发的时候,你会不自觉地去思考整个系统的软件架构设计。 相信广大读者都是裸机开发的。
我认为没有最好的软件架构(程序架构),只有最适合的。 因为不同的程序设计适用于不同的应用场景,简单地比较哪种程序架构最好是没有意义的。
那么我们来分析一下具体的应用场景。 在一些逻辑清晰、功能单一的系统中,很适合选择顺序执行的前后端架构。 这种软件架构往往可以满足我们的大部分需求,比如电饭煲、电磁炉和声控灯泡等;
非常适合一些资源匮乏,对系统可靠性要求高的单片机,因为这种方式的系统开销比较小,而且只牺牲了一个定时器,但是选择这种程序架构需要我们进行时间片制作故意分裂;
最后,在一些功能复杂、逻辑控制困难的系统中,适合选择多任务操作系统嵌入式软件开发专业,比如视频监控系统、无人机等应用场景。
作为一名嵌入式软件工程师,掌握这三种软件架构是非常有必要的。 它们让我们在设计程序时有更多的选择和思考,每一种不同的程序架构都有自己的优势。 而不足之处,这就需要我们去苦练才能体会到它的奥妙。