Hi,您好,欢迎来到西安盛图软件科技有限公司!

盛图科技|嵌入式软件的设计范畴

发布时间:2023-07-17 13:35:14

嵌入式软件对于大多数程序员来说不再是一个陌生的字眼;但是,面对复杂的软件系统却令一些初学者望而却步,显得高深莫测。

由于嵌人式软件不只是涉及字处理、数据表格、媒体播放、网络应用、聊天互动等常规的应用程序,它还涉及各种应用产品所必需的中间件,底层核心平台的开发,底层操作系统的核心组件,各种外部设备驱动,整个应用产品的系统配置和引导程序,以及产品管理、调试、升级等各个方面。因此,嵌人式软件是一个庞大的体系。与此同时,嵌人式软件还要求具有高度的稳定性和实时性。

粗略说来,嵌入式产品作为一个完整、独立的设备产品,它所需开发的主要软件组件包括嵌入式操作系统和应用程序这两大核心部分。前一部分提供应用软件运行的平台,后一部分解决各种各样的实际应用问题,比如,播放一部电影或者听一首 MP3,阅读新闻,浏览照片等等

操作系统平台软件以及应用程序软件都是可以看得见、摸得着的部分,也就是说,是为众多软件设计者所熟知的部分。除此之外,嵌人式软件的设计还包括对产品系统的管理程序,常常称这一部分程序为固件程序(firmware)。它们驻留于产品的存储设备中平常不为程序员和产品用户所感知。作为一个完整产品的固件程序,它与人们常说的某个外部设备如USB设备的固件程序,或者音视频编解码的固件程序不同。后者主要是内嵌在某个设备之中,或者装人到系统内存里,目的是扩充使用硬件的部分或全部功能。而作为一个产品的固件程序,其功能类似于个人电脑里的BIOS它需要管理整个产品系统保存系统配置数据做系统必要的初始化工作,引导操作系统,更新整个系统的软件,以及当系统出现严重错误时进行诊断与系统恢复。

综上所述,嵌人式软件大体分为3类:一是操作系统平台软件,二是应用软件,三是产品化软件。产品化软件是对前两类实体的包装,是对整个产品的管理,包括引导、以及必要的调试、下载和升级等辅助功能。

为什么要设计嵌入式平台软件?对于应用软件开发的工程师来说,平常很少关心平台软件的事情。为什么在嵌入式系统的设计中要提平台软件呢?由于嵌入式产品硬件的不通用性,即各个厂家所设计的 SOC硬件互不兼容因此就没有一个完全通用的软件产品是针对特定某一个硬件环境设计的。这方面与 PC机的体系架构和软件体系架构完全不同。

PC机的硬件体系目前只有几大阵容,最大的PC机提供商Intel,使用了大家熟知的x86体系,采用标准的 PCI总线,南桥北桥结构;另一硬件体系的提供商AMD,也使用了几乎与x86类似的CPU指令系统只是在内存管理方式上去除了老式繁杂的段页模式。PC 机硬件体系结构的相对单一,给系统软件的实现带来了极大的便利和兼容的可能。软件方面,微软的Windows操作系统平台占据了主流,各个PC硬件厂商所提供的软件支持都会兼容 Windows平台。除此之外,Linux也被广泛用于PC硬件平台。由于它们的底层硬件体系很相似,所以系统软件都相似;对于不同的PC设备,只要增加支持不同硬件所需的驱动软件即可。与此同时,在PC平台下,广大程序员也只需关心操作系统平台之上的应用程序的开发,例如数据库播放软件财务软件聊天软件、绘图软件和网页制作软件等。

但是在嵌人式软件领域中,这个情形发生了显著的变化。嵌人式硬件设备商往往为了解决某些专用问题而设计出专用的 SoC 芯片。首先,这些 SoC 芯片采用了不同体系结构的RISCCPU,比较著名的有 MIPSARM,PowerPC等,它们从指令集上就完全不同。其次每个SoC芯片定义了完全不同的地址分布和引脚功能,并且片内集成的外围设备也互不相同因此,为某一个硬件芯片组所编写的与硬件相关的软件,在另一个芯片组系统里完全不能使用。换句话说,一个开发团队的软件工程师需要针对不同的硬件平台开发或移植不同的固件程序操作系统程序和应用程序。

由此看来,嵌人式软件设计的范畴非常广泛,这对于嵌人式软件设计程序员来说是一个非常严峻的挑战。因为一个团队要负责某电子产品嵌人式软件设计的方方面面,最终要向市场或向用户递交一个完整的该电子产品所涉及的软件系统。

f176c5a11fbfa4d511bcf45edae5ce5.png

应用软件的开发与在 PC机系统里开发的各种财务、邮件和通信程序非常类似,也可以使用图形化控件可视化工具、脚本工具和面向对象语言等来设计,但两者还有很多差别首先,运行的平台不一样,指令系统不一样,因此,必须使用交叉编译工具进行编译。在嵌入式设备里运行的所有库文件和各种依赖文件必须全部是针对这个平台的二进制格式文件。其次,嵌入式平台提供的调用接口库不如 PC机平台中的完备,有些模块可能没有实现有些函数调用也可能没有实现;有些功能类似的函数调用,名字可能不同,所使用的参数也可能不同。那么针对这些类似的情况,就必须了解这些平台所提供的具体功能;在设计应用时对于平台没有实现的功能,就必须通过其他方法来实现,或者自己在程序中将这些功能实现。在设计嵌人式应用软件时还要考虑跨平台的需求,以增强所开发软件的通用性。由于各种操作系统的差异和各个硬件平台的不同,必要时可能需要对一些系统调用进行封装,以实现跨平台的外部接口的一致性。

例如,某公司开发了一个浏览器,为了在不同操作系统平台上推广,或者在不同硬件平台和不同图形界面上推广,则该浏览器在实现时须将那些调用操作系统、调用图形输出的接口抽象出来,以提供单一的外部接口。比如定义创建线程的函数 create_brws_thread(),createbrws_semaphore(),init_brws_graphics(), create_brws_device_context( ), create_brwsevent_queue(),brws_rect_fill(),brws_line_to(),brwsdraw_text(),等等除了使用统一的接口外,还可以使用编译宏来包含不同平台或不同硬件系统下的特定代码。例如:

#ifdef WINCEPLAT

// code for WinCE platform

#elif defined(LINUX PLAT)

// code for Linux platform

# endif

最常见的产品固件程序就是 Boot-loader。Boot-loader 的基本功能是在设备电源上电的最初过程中,对硬件进行必要的设置,以使整个硬件平台工作于可知的预定状态,比如,在产品设备上电时,中断控制寄存器的中断请求位或中断允许位可能存在随机的不确定值,各个外部设备的寄存器值也可能处于随机状态,这些不确定值可能导致不期望的中断产生,或者影响系统的正常运行,这些情况都需要对硬件设备进行初始设置。Boot-loader 随后的工作是初始化内存,开辟系统正常工作的存储空间,设置调用函数时所需用的栈,禁止中断,必要时,开启cache,使能MMU然后将操作系统从指定的ROM区域搬运到系统内存中并开始运行它。除了Boot-loader的这些基本功能之外固件程序还有许多扩展功能。比如下载功能调试功能与用户交互的功能和编程Flash的功能,等等。为此Boot-loader 里面需要实现一些额外的驱动,例如,用于下载的串口驱动,网络驱动,USB驱动,用于调试的串口驱动,以及用于编程Flash的驱动。为了支持这些设备,除了驱动之外还需要一些协议的实现如UDP协议以及对文件系统的简要支持。

另外,Boot-loader还需要管理一些额外的有关系统配置的信息,比如操作系统存放的位置,电源电量的数值,或其他与设备相关的用户设置等。这些数据可能存放在固件程序的某个数据区域,以便在系统引导时能够正确加载到操作系统,对设备进行正确的配置。


上一篇:7-10年后计算机专业是否还会火热?
下一篇:干货分享|为什么有这么多编程语言?