一个实际嵌入式系统架构的演化历程 (一个实际嵌入多个图层)
上世纪九十年代,互联网的极速发展让通讯测试设备也得到了极大的发展。那个年代,能够实现某种测量的硬件是竞争的核心,软件的目的仅仅是驱动硬件运行起来,再提供一个简单的界面。所以,最初的产品的软件结构非常简单,类似前面的城铁门禁系统。
1. 数据处理
用户要求能将测量结果保存下来,并可以重新打开。数据存储模块和界面被独立出来。依然保持上面的主逻辑,但是界面部分不仅可以显示实时的数据,也可以从ResultManager中读取数据来显示。
2. 窗口管理
随着功能不断复杂,界面窗口越来越多,原来靠一个类来绘制各种界面的方式已经不能承受。于是窗口的概念被引入。每个界面都被视为一个窗口,窗口中的元素为控件。窗口的打开,关闭,隐藏则由窗口管理器负责。
3. MVC模式
随着规模进一步扩大,最初的大循环结构终于无法满足日益复杂的需求了。标准的MVC模式被引入,经历了一次大的重构。数据中心作为Model被独立出来,保存着当前最新的数据。View被放在了独立的任务中执行,定期从DataCenter轮询数据。用户的操作通过View发送给Controller,进一步调用硬件驱动执行。硬件执行的结果从驱动到Controller更新到DataCenter中。界面,数据,命令三者基本解耦。ResultManager成为DataCenter的一个组件,View不再直接与其通讯。MVC模式的引入,第一次让这个产品了有真正意义上职责明晰,功能独立的架构。
4. 大量类似模块,低效的复用
到上一步,作为一个单独的嵌入式设备,其架构基本可以满足需求。但是随着市场的扩展,越来越多的设备被设计出来。这些设备虽然执行的具体测量任务不同,但是他们都有着同样的操作方式,类似的界面,更主要的是,它们面临的问题领域是相同的。长期以来,复制和粘贴是唯一的复用方式,甚至类名变量名都来不及改。一个错误在一个设备上被修正,同样一段代码的错误在其他设备上却来不及修改。而随着团队规模的扩大,甚至MVC的基本架构在一些新设备上都没能遵守。
最终框架被引入了这个系列的产品。框架确定了如下内容:
- 界面的抽象
- 硬件驱动抽象
- 功能模块抽象
- 命令架构
- 测试框架
5. 远程控制
客户希望将设备固定安放在网络的某个位置,作为探针使用,在办公室通过远程控制来访问这个设备。这对于原本是作为纯手持设备设计的系统又是一个挑战。幸运的是,MVC架构具有相当的弹性,早期的投入获得了回报。TL1Server对外提供基于Te的远程控制接口。在系统内部,它的位置相当于View,只和原有的Controller和DataCenter通讯。
6. 自动化的TL1解释器
由于TL1命令相当多,而TL1又往往不是客户的第一需求,很多设备的TL1命令开始不完整。究其原因,还是手写TL1命令的解释器太累。后来通过引入Bison和Flex,这个问题有所改善,但还是不足。自动化代码生成在这个阶段被引入。通过以如下的格式定义TL1,工具可以自动生成TL1的编码和解码器代码。
CMD_NAME{cmd=SET-TIME-CONFIG::<ctag>::<year>,<month>,<day>,<hour>,<minute>,[<second>]year=1970..2100month=1..12day=1..31hour=0..23minute=0..59second=0..59}
7. 测试的难题
经过数十年的积累,产品已经成为一个系列,几十种设备。大部分设备进入了维护期,经常有客户提一些小的改进,或者要求修正一下缺陷。繁重的手工回归测试成为了噩梦。基于TL1的自动化测试极大的解放了测试人员。通过在PC上运行的测试脚本,回归测试变得简单而可靠。唯一不足的是界面部分无法验证。基于TestQuest的自动化工具需要在设备运行的pSOS系统上开发一个小的Bridge,将设备上的界面内容通过IPC发送到PC上的测试工具上,再利用TestQuest的UI Automation模块验证。
总结
通讯测试设备的软件架构演进是一个持续的过程,在不断适应市场需求和技术发展的过程中,架构也在不断优化和重构。从最初的单片机架构到现在的分布式架构,从手工编码到自动化代码生成,这个过程见证了软件工程的发展和行业的变迁。
嵌入式开发系统基本流程
嵌入式开发系统基本流程如下:
1.确定需求
首先,明确系统的需求和功能。了解项目的背景和目标,包括设备的类型、预期的功能、性能要求等。与利益相关者合作,明确他们的需求和期望。
2.硬件设计
根据需求,进行硬件设计。选择合适的硬件平台和组件,包括处理器、存储器、传感器、通信接口等。进行硬件电路设计和布局,确保硬件能够满足系统需求。
3.软件设计
基于硬件设计和系统需求,进行软件设计。确定软件架构和模块划分,定义系统的各个模块和功能。选择适当的编程语言和开发工具,如C、C++、汇编语言等。
4.开发软件
根据软件设计,开始编写和开发嵌入式软件。实现各个模块的功能,包括设备驱动程序、算法实现、用户界面等。进行模块测试和集成测试,确保软件的正确性和功能完整性。
5.硬件和软件集成
需要将开发好的软件与硬件进行集成。确保软件和硬件之间的交互和通信正常工作。进行整体系统测试,验证系统的功能和性能。
6.调试和优化
在集成和测试过程中,可能会出现问题或性能瓶颈。进行调试和优化,修复软件缺陷,提高系统的性能和稳定性。使用调试工具和技术,如仿真器、调试器等。
7.部署和验证
完成软件开发和调试后,将软件部署到目标设备中进行验证。验证系统在实际环境中的功能和性能,确保满足用户需求和预期的标准。
8.维护和更新
嵌入式系统的开发并不是一次性的过程,而是一个持续的过程。系统上线后,需要进行维护和更新,修复软件漏洞,增加新的功能和改进性能。
嵌入式系统历史发展
嵌入式系统历史发展
从20世纪七十年代单片机的出现到各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了近30年的发展历史。
嵌入式系统的出现最初是基于单片机的。70年代单片机的出现,使得汽车、家电、工业机器、通信装置以及成千上万种产品可以通过内嵌电子装置来获得更佳的使用性能:更容易使用、更快、更便宜。这些装置已经初步具备了嵌入式的应用特点,但是这时的应用只是使用8位的芯片,执行一些单线程的程序,还谈不上“系统”的概念。
最早的单片机是Intel公司的 8048,它出现在1976年。Motorola同时推出了68HC05,Zilog公司推出了Z80系列,这些早期的单片机均含有256字节的RAM、4K的ROM、4 个8位并口、1个全双工串行口、两个16位定 时 器。之后在80年代初,Intel又进一步完善了8048,在它的基础上研制成功了8051,这在单片机的历史上是值得纪念的一页,迄今为止,51系列的单片机仍然是最为成功的单片机芯片,在各种产品中有着非常广泛的应用。
从80年代早期开始,嵌入式系统的程序员开始用商业级的“操作系统”编写嵌入式应用软件,这使得可以获取更短的开发周期,更低的开发资金和更高的开发效率,“嵌入式系统”真正出现了。确切点说,这个时候的操作系统是一个实时核,这个实时核包含了许多传统操作系统的特征,包括任务管理、任务间通讯、同步与相互排斥、中断支持、内存管理等功能。
其中比较著名的有Ready System 公司的VRTX、Integrated System Incorporation (ISI)的PSOS和IMG的VxWorks、QNX公司的QNX 等。这些嵌入式操作系统都具有嵌入式的典型特点:它们均采用占先式的调度,响应的时间很短,任务执行的时间可以确定;系统内核很小,具有可裁剪,可扩充和可移植性,可以移植到各种处理器上;较强的实时和可靠性,适合嵌入式应用。这些嵌入式实时多任务操作系统的出现,使得应用开发人员得以从小范围的开发解放出来,同时也促使嵌入式有了更为广阔的应用空间。
90年代以后,随着对实时性要求的提高,软件规模不断上升,实时核逐渐发展为实时多任务操作系统(RTOS),并作为一种软件平台逐步成为目前国际嵌入式系统的主流。这时候更多的公司看到了嵌入式系统的广阔发展前景,开始大力发展自己的嵌入式操作系统。除了上面的几家老牌公司以外,还出现了Palm OS,WinCE,嵌入式Linux,Lynx,Nucleux,以及国内的Hopen,Delta Os等嵌入式操作系统。随着嵌入式技术的发展前景日益广阔,相信会有更多的嵌入式操作系统软件出现。
;免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。