深入介绍嵌入式开发中三种不同的程序架构

发布者:JoyfulSunflower最新更新时间:2024-06-19 来源: elecfans关键字:嵌入式开发  程序架构  软件架构 手机看文章 扫描二维码
随时随地手机看文章

前言

嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。


软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。

我相信在嵌入式或单片机软件开发的初期大多数开发者采用的都是简单的前后台顺序执行架构(我就是这样的)。在嵌入式软件开发中,程序架构主要分为三种,本篇文章将对这三种程序架构做出详解。

软件架构存在的意义

可以说一个好的程序架构,是一个有经验的工程师和一个初学者的分水岭。软件架构对于开发人员是友好的,你希望先执行什么任务后执行什么任务,或者这一个时间点执行什么任务下一个执行什么任务,又或者什么事件会同步到某个任务等等,在不同的软件架构下,解决上述问题的具体方法都是有所区别的。

软件架构对开发者最大的帮助是:帮助开发者掌控整个工程的框架,当你熟练使用其中某一个程序架构后,对于系统中出现的bug你一定能够快速的定位并解决。当然,我建议要根据需要选择合适的软件架构进行开发,具体原因在文章后面会进行介绍。

深入介绍三种不同的程序架构

三种常用的软件架构有:顺序执行的前后台系统、时间片轮询系统和多任务操作系统:STM32单片机开发中的RTOS。为了让大家有一个更为清晰的认识,我分别用三种软件架构对一个实例进行介绍说明。这个实例如下:它有4个任务,这4个任务为按键扫描、声光报警、显示屏刷新和超声波测距。这个实例的具体功能是通过按键设置测量距离的阈值,当测距距离低于设置的阈值时,触发声光报警并且将测量距离实时显示在显示屏上(这个应用是汽车倒车雷达的具体体现)。

1 顺序执行的前后台系统

在顺序执行的前后台系统中,我会把键盘扫描用查询的方式放在while(1)中,而显示屏刷新和超声波测距使用中断,在中断服务函数中获取测量距离后进行显示,在主函数的循环中进行按键的检测,声光处理也放在主循环中。这样整个程序就以变量标志的同步方式在主循环和后台中断中执行,对应的程序代码如图所示:

3e999498-da78-11ec-ba43-dac502259ad0.jpg

上面代码是顺序执行前后台系统的主函数。

3eb734da-da78-11ec-ba43-dac502259ad0.jpg

如上代码,顺序执行前后台系统的中断服务函数。

这种架构的优点是使用简单易于理解,而缺点是每个任务所占的CPU时间过长的话,会导致程序的实时性能差,就比如按键的检测等。

2 时间片轮询系统和多任务操作系统

时间片轮询法实际上通常出现在操作系统中,也就是说他属于操作系统,但在这里所说的是基于前后台系统的时间片轮询。

时间片轮询法的实质其实就是选出一个定时器,每进一次定时中断对计数值进行自加,在主循环中根据这个计数值执行任务,这个计数值也就是任务轮询的时间片。

在这个实例中,如果采用时间片轮询系统的话,首先选用主控芯片的任一定时器,定时器定时时间周期由我们决定,为了保证实时性和运行效率,这个值通常取10ms、30ms、50ms等,我会将按键扫描轮值值设置为20ms,因为按键抖动的时长一般为20ms,这样处理既达到了消抖的目的,又不会漏掉按键的检测。

而显示屏的刷新设置为30ms,如果你觉得刷新反应慢了也可以修改这一轮询值得到改善;而超声波测距的轮询值设置为100ms,即每隔100模式触发测距一次,这个测距频率已经能够满足大多数的情况了。

程序代码如下:

3eceb5c4-da78-11ec-ba43-dac502259ad0.jpg

如上代码,时间片轮询系统的主函数。

3ef774b4-da78-11ec-ba43-dac502259ad0.jpg

如上代码,时间片轮询系统的定时器中断函数。

可以看出时间片轮询法相比顺序执行还是有很大优势的,既有顺序执行法的优点,也有操作系统的部分优点。

3 多任务操作系统

操作系统的本身是一个比较复杂的东西,任务的管理和调度实现的底层是很复杂和困难的。

但是,我们一般都是把操作系统本身作为一个工具一个平台,我们的目的是使用它的功能而不是开发一个操作系统。

我使用过ucos和freertos小型的实时操作系统,也使用过Linux大型的操作系统,有了操作系统,不管是对于程序的稳定性和开发的效率都会好很多。

我们在使用操作系统的时候更多的需要去学习和理解它的一些调度和通信的方式。

实际上真正能使用操作系统的人并不多,反而是跑裸机的占大多数,这也和产品的具体要求有关,很多简单的系统只需要裸机即可满足。

在这里本我不过多的介绍操作系统本身,因为操作系统确实挺复杂的,下面图例中的代码是在freertos中创建按键控制LED亮灭的程序结构,大家可以对比一下:

3f1cde0c-da78-11ec-ba43-dac502259ad0.jpg

如上,freertos多任务系统中主函数。

3f3ae94c-da78-11ec-ba43-dac502259ad0.jpg

如上,freertos多任务操作系统中的任务回调函数。

如何选择合适的软件架构

我使用过多种不同MCU做项目开发,例如:STM32、STC15、新唐等,也接触过复杂的设计需求,例如:车载智能系统和智能家居,跑过操作系统ucos、freertos和Linux等等,在回到裸机开发时,就会不然而然的去思考完整系统的软件架构的设计问题,相信在读者中开发裸机的也占大多数。

我认为没有最好的软件架构(程序架构),而是只有最合适的。因为在不同的应用场景中适合采用不同的程序设计,而单纯的去比较哪种程序架构是最好的没有什么实际的意义。

那接下来我们来对具体的应用场景进行分析:

在一些逻辑清晰功能单一的系统中就很适合选择顺序执行的前后台架构,这个软件架构往往能够满足我们大部分的需求,比如电饭煲、电磁炉和声控灯泡等;

在一些资源缺乏的单片机并且对系统可靠性要求较高的情况下非常适合,因为这种方法的系统耗费比较小,只是牺牲了一个定时器而已,但是选择此种程序架构需要我们对时间片进行深思熟虑的划分;

最后,在一些功能复杂,逻辑控制较为困难的系统中就适合选择多任务操作系统,比如视频监控系统、无人机等等应用场景。

作为嵌入式软件工程师,掌握这三种软件架构是非常有必要的,它们可以让我们在设计程序时拥有更多的选择和思考,而每一种不同的程序架构都具备它自己的优势与不足,这需要我们去用心实践方可体会到它的奥妙。


关键字:嵌入式开发  程序架构  软件架构 引用地址:深入介绍嵌入式开发中三种不同的程序架构

上一篇:单片机中常见GPIO的八种工作模式详解
下一篇:为什么晶振不集成到芯片内部去?

推荐阅读最新更新时间:2024-11-08 19:56

专访IAR亚太区副总裁:助力中国嵌入式行业快速拥抱行业变迁
如果用一个词总结2023年的嵌入式行业,那必然是日新月异。过去一年中,随着技术进一步发展,加之市场继续洗牌,嵌入式行业又掀起新一轮热潮。 I3C、RISC-V、嵌入式AI、物联网(IoT)和嵌入式安全、汽车嵌入式……当我们面临新趋势,更为复杂的嵌入式软件开发将会成为每一位开发者需要面临的问题。 IAR Embedded Workbench集成开发环境一直是全球众多开发者在嵌入式软件开发中的优选解决方案。这一强大的工具套件已经为数百万开发者提供了全面且高效的支持。 作为拥有40年历史的企业,这家公司对于嵌入式行业有什么理解,又该如何帮助中国嵌入式开发者快速拥抱行业新趋势? 我们邀请了IAR亚太区副总裁Kiyo Uem
[嵌入式]
专访IAR亚太区副总裁:助力中国嵌入式行业快速拥抱行业变迁
STM32嵌入式开发学习笔记(一)
本文中,笔者将介绍使用嵌入式开发工具Keil uVision5,使用C语言,对微处理器STM32F103C8进行嵌入式开发。 开发使用C语言,首先需要新建一个C语言文件,将其设为主函数的入口,因此,将此文件命名为main.c 配置好软硬件依赖环境后,在此文件中键入如下内容,尝试编译,如果能够编译成功说明环境配置成功。 stm32f10x.h库的功能是提供对于stm32f10x系列开发板的所有功能的定义与实现,因此在头文件中要加一句。 #include stdio.h #include stm32f10x.h int main(){ return 0; } 实验1:让小灯常亮 查阅STM32技术手册,
[单片机]
深入解析汽车MCU的软件架构
电动汽车(EV)正在成为首选的交通方式,为传统内燃机汽车提供了一种可持续发展的环保型替代方案。在电动汽车复杂的生态系统中,众多电子控制单元(ECU)在确保其高效运行方面发挥着至关重要的作用。电机控制单元(MCU)就是这样一个 ECU,它是电机性能背后的大脑。在这篇综合文章中,我们将探索电机控制单元的世界,研究它们的功能、组件以及影响汽车 MCU 领域的最新趋势。 了解电动汽车使用的电机 在深入研究电动汽车电机控制单元的复杂性之前,有必要了解电动汽车常用的各种电机类型。最常见的两种类型是无刷直流(BLDC)电机和永磁同步(PMS)电机。 无刷直流电机又称电子换向电机,无需电刷和换向器,从而提高了效率,减少了维护。从本质上讲,它的
[嵌入式]
深入解析汽车MCU的<font color='red'>软件</font><font color='red'>架构</font>
基于Android系统的车载娱乐系统软件架构
引言     车载电子行业有着巨大的市场潜力,因为车主们期望将用在手机上面的某些应用软件直接运行在自己的私家车上。但同时也面临诸多挑战,车载电子厂商需要满足不同汽车型号的要求,而且即便是同一品牌的不同车型往往也需要不同的定制。如今的车主们都希望能够像使用智能手机一样随心所欲地安装或者删除应用软件。要将手机上使用的软件移植到车载电子系统中,开发者必须面对一个严峻的挑战,即第三方应用程序必须在一个隔离的环境中运行,以此来阻止对其他车载功能模块的干扰,以及可能使车主信息泄露等威胁。同时,第三方应用软件必须跟车载其他系统有效地结合起来,以便给用户带来更加完美的用户体验。最后,第三方软件开发者必须针对车载系统的共同特征,开发一套公用平台,以
[嵌入式]
又一款入门级嵌入式开发平台!米尔STM32MP135核心板新品发布
又一款入门级嵌入式开发平台!米尔STM32MP135核心板新品发布 自2007年意法半导体(ST)推出STM32首款Cortex-M内核 MCU,十几年来,ST在MCU领域的发展是飞速向前的。而2019年ST发布了全新的STM32MPU系列产品线,STM32MP1作为新一代 MPU 的典范,有着极富开创意义的异构系统架构兼容并蓄了 MPU 和 MCU 双重优势,受到业界的喜爱!米尔电子作为ST官方合作伙伴,在意法半导体发布前就获得样品,并组建产品团队研发核心板,此前,米尔发布的基于STM32MP1系列的核心板和开发板受到广大客户的认可和喜爱,有超过500家的客户选择,应用行业丰富。 米尔作为嵌入式处理器模组行业的领头
[嵌入式]
又一款入门级<font color='red'>嵌入式开发</font>平台!米尔STM32MP135核心板新品发布
基于VxBus设备驱动程序架构的设备驱动开发
    VxBus是风河公司新的设备驱动程序架构,是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。在以前的版本中,驱动程序并没有和工程配置集成到一起,如果要配置设备驱动,就要通过修改BSP目录下的config.h和syslib.c文件来完成。而基于VxBus架构模型的好处是允许驱动的集成和配置在Workbench工程中完成。这就意味着在Workbench环境下,每个驱动程序都能通过可视化环境进行配置,都能够按要求添加或删除设备。本文结合基于PCI2040数据采集卡驱动的开发过程 ,分析了VxBus架构下驱动的设计实现。 1 VxBus简介  VxBus是指在VxWorks中用于支
[嵌入式]
以太网网关域控制器软件架构
服务接口定义:根据车辆架构的功能,将包含在网关控制器中的服务在PREEvision工具中设计。该服务包括服务提供者和服务消费者。服务提供者的主要工作是提供服务,服务消费者向服务提供者发送服务请求以获取服务功能,网关控制器车辆应用信息以服务接口的形式定义,主要包括方法、事件和属性。在PREEvision工具中,根据服务内容建立服务接口,定义其方法和事件。 对于方法,需要定义其输入和输出参数。在这个设计过程中,服务的接口由AUTOSAR软件架构实现,服务提供者和消费者由AUTOSAR软件组件(SWC)实现,稍后分配给ECU组件。图1. SWCS 通过端口传输信息,服务接口封装到端口中。端口可分为“发送/接收数据”和“发送/接收
[嵌入式]
以太网网关域控制器<font color='red'>软件</font><font color='red'>架构</font>
详解嵌入式开发中的I2C总线
硬盘、U盘等这些设备中都有一个“掉电保存”的器件,他们的特点就是没电了之后,存在他们上面的信息不会丢失,就像人的大脑,有记忆功能。在工业领域也非常常见这种器件,一般有EEPROM和FLASH。它俩共同点是可读可写,断电保存。 不同点是EEPROM写之前不用擦除,而FLASH写之前一定要擦除,否则写不成功;EEPROM一般都使用I2C总线来通信,而FLASH一般是使用SPI总线。 EEPROM存储器系统架构图如下。 位传输 I2C总线是由飞利浦(Philips)公司开发的一种双向二线制同步串行总线,实现有效的IC间的控制,它只需要两根线(SDA和SCL)即可在连接于总线上的器件之间传送信息。 I2C总线在传输数据都是按照
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved