嵌入式软件除了具有计算机软件的一般特性外,还具有一些与嵌入式系统特性密切相关的特点。因此,嵌入式系统与通用计算机软件有所不同:
在嵌入式系统中,操作系统和应用系统集成与计算机硬件系统中,系统软件、应用软件和系统的硬件一体化,我们为了提高系统的启动、执行速度和系统的可靠性,嵌入式系统一般都固化与半导体存储器中,也大可以认为是压缩后存储在内存之中,而不会存储与磁盘等外存储器之中。
当我们在设计嵌入式的应用时,特别需要考虑的是成本的因素,嵌入式软件的时间和空间上都受到了严格的限制。嵌入式系统往往有较高的实时性要求,软件对于外部做出反应的时间要快,在某些情况下还要求响应时间是确定的和可预测性的。
在我们生活的环境之中,是有许许多多的自然因素是我们无法预测和控制的,这也就使得我们的嵌入式系统的工作环境也是一样。于此因此,在嵌入式软件开发中一般都是需要涉及到底层软件,这就要求开发人员要有扎实的软件和硬件基础,能够灵活的运用不同的开发手段和工具。
这个就比较简单的理解了,这些之中有许多是很久以前20世纪就以研发出来并且配套产品一同进入我们的市场。
一般来说,嵌入式系统可以根据所运行的环境不同和要求不同将嵌入式系统的软件划分位多种不同的结构。
在一些低端的嵌入式系统中,处理器的处理能力比较低,存储的容量也比较小,所以一般来说系统的功能都是相对的比较简单,通常也只需要一写简单的控制操作。
而最简单的软件结构就是轮询结构,其工作原理就可以类比高级语言中C语言的for循环,重复循环检查每个外部输入条件,一旦有需要或者说是达到标准的任务时,就进行相关的处理。
//初始化
while(TRUE)
{
if(I/O设备1需要服务);//执行设备1服务函数
if(I/O设备2需要服务);//执行设备2服务函数
if(I/O设备3需要服务);//执行设备3服务函数
if(I/O设备4需要服务);//执行设备4服务函数
... ...
if(I/O设备n需要服务);//执行设备n服务函数
}
电子相关专业的同学应该用过一个仪器就是“数字万用表”,而这个仪器就是根据这个简单的结构进行的测量操作
该结构的优点在于结构简单,便于编程。但是因为缺少了中断机制,所以存在着程序随机切换时的一些潜在问题。
这种结构在简单的轮询结构的“主循环”基础上增加中断服务程序(ISR)
中断服务程序处理特别紧急的服务请求,设置状态标志;循环主程序轮询这些状态标志,并进行后续的处理。
这种结构也被称为中断驱动结构或前后台结构。
BOOL SA=FALSE; //A状态标志初值
BOOL SB=FALSE; //B状态标志初值
... ...
//事件A中断服务程序
{
事件A紧急操作;
SA=TRUE;
}
//事件B中断服务程序
{
事件B紧急操作;
SB=TRUE;
}
... ...
void main(void)
{
while(TRUE)
{
if(SA)
{
SA=FALSE;
事件A非紧急操作;
}
if(SB)
{
SB=FALSE;
事件B非紧急操作;
}
.... ...
}
}
我们生活中的一个简单洗衣机的控制程序就是采用带中断的轮询结构
复杂的嵌入式系统要求嵌入式软件必须以多任务方式运行。为了合理地调度多任务和利用系统资源,通常需要选配嵌入式操作系统(Embedded Operating System,EOS)
对与一些中端的嵌入式系统,小型的监控式操作系统就可以满足需求。这类操作系统通常只包含内核(kernel),以多个并发的任务(task)取代“主循环”。而操作系统的内核负责多任务处理,执行任务创建与初始化、任务调度、存储管理、时钟与中断管理等。
事件B中断服务程序
{
事件B紧急操作;
发送信号T;
}
......
void task1( void)
while(TRUE){
等待信号S;
事件A非紧急操作;
}
}
手机和汽车上的导航设备就是基于这个中监控式操作系统设计。
这种结构的操作系统可以认为是一种高端嵌入式系统(可以类似于Andriod或者ios的智能手机系统)。其中,嵌入式系统软件控制和管理系统中的资源,为嵌入式应用提供支持,通常又可分为硬件抽象层/驱动层(HAL)、操作系统层和中间件层。
应用软件层: | 应用任务1 | 应用任务2 | … | 应用任务n |
---|---|---|---|---|
中间件层 : | Java中间件 | 消息中间件 | … | 数据库访问中间件 |
操作系统层: | 通信协议 | 文件系统 | 操作系统内核 | 嵌入式GUI |
硬件抽象层 | 引导加载程序 | 存储器驱动 | 定时器驱动 | I/O驱动 |
硬件层:若干硬件设备 |
1.3.1:
中间件:除了操作系统内核、设备驱动程序和应用软件之外的系统软件。是具有标准程序接口和协议的通用服务。
硬件抽象层(Hardware Abstract Layer,HAL):是操作系统层与硬件之间设置的独立接口软件层,是具有直接依赖硬件的软件。引入HAL的目的就是对硬件进行抽象化,即将控制所有硬件电路的软件代码封装起来,使上层软件开发人员无须关心底层硬件的具体细节和差异。
板级支持包(Board Support Package,BSP):是由用户或硬件制造商编写的依赖与硬件的代码。
BSP在系统复位后负责系统硬软件的初始化,其功能可以分为三部分:
1):系统复位时的硬件初始化,包括处理器芯片的初始化和电路板的初始化
2):为操作系统提高硬件相关的驱动程序支持
3):引导加载操作系统,对硬件初始化后的对系统级的初始化
1.4.1:引导加载程序的概念和功能
引导加载程序(引导程序)bootloader是底层软件的一部分。嵌入式系统上电复位后首先运行引导加载程序,它负责系统的上电自检、硬件初始化、建立存储空间映射、配置系统参数、建立上层软件的运行环境,并加载和启动操作系统。
1.4.2:嵌入式操作系统的加载方式
1):在Rom中直接运行操作系统代码
2):在Ram中运行操作系统代码
3):从外存储器加载操作系统代码运行
4):从通信端口加载操作系统代码(下载)