1、嵌入式系统的软件结构

简单的轮询结构:

在低端嵌入式系统中,处理器的处理能力较低,存储器容量很小,系统功能简单,通常只实现一些简单的控制操作。这种嵌入式系统不需要操作系统支持,应用软件直接在裸机上运行。
轮询结构中,应用程序重复循环检查每个外部输入条件,一旦有需要处理的任务,则进行相应的处理。只应用在系统的任务数量较少、任务处理简单且实时性要求不高的场景。

带中断的轮询结构:

在简单的轮询结构的主循环基础上增加中断服务程序(ISR),中断服务程序处理特别紧急的服务请求,然后设置状态标志;循环主程序轮询这些状态标志,并进行后续的处理。

监控式操作系统+应用软件结构:

监控式嵌入式操作系统),这类嵌入式操作系统通常只包含内核,通过任务调度和任务切换保证任务的并行运行,各任务之间以及任务与中断服务程序之间的通信、同步和互斥也需要操作系统的支持。

通用嵌入式操作系统+应用软件结构:

高端嵌入式操作系统包含驱动程序以及文件系统、网络协议栈等多种组件的复杂结构,应用程序则用于实现用户功能。

2、硬件抽象层与板级支持包

硬件抽象层(HAL): 嵌入式系统底层软件,是在操作系统层与硬件之间设置的独立的接口软件层,是所有直接依赖于硬件的软件,包括引导程序、硬件配置程序和硬件访问代码等。
板级支持包(BSP): 为了实现OS在不同硬件平台之间的可移植性,许多OS厂商会定义硬件无关代码与硬件相关代码之间的接口规范。硬件无关的OS代码在不同的硬件平台上是相同的,由OS厂商提供。而依赖于硬件的代码通常要由用户或硬件制造商专门编写,这部分代码通常被称为板级支持包。
板级支持包使得嵌入式操作系统能够通用于BSP所支持的不同硬件平台,实现嵌入式操作系统的可移植性和跨平台性。板级支持包是硬件抽象层在特定操作系统环境下的具体实现。
BSP在系统复位之后负责系统软硬件环境的初始化,其功能也可以分为三部分:

  1. 系统复位时的硬件初始化,包括处理器芯片的初始化和电路板的初始化
  2. 为操作系统提供硬件相关的驱动程序支持
  3. 引导加载操作系统

    3、引导加载程序

    引导加载程序(bootloader): 是底层软件的一部分。嵌入式系统上电复位后首先运行引导加载程序,它负责系统的上电自检、硬件初始化、建立存储空间映射、配置系统参数、建立上层软件的运行环境,并加载和启动操作系统。
    根据操作系统映像存放位置的不同,嵌入式操作系统引导加载方式有:
    在ROM中直接运行操作系统代码
    在RAM中运行操作系统代码
    从外存储器加载操作系统代码运行
    从通信端口加载操作系统代码运行
    大多数从flash存储器上启动的bootloader程序采用两阶段执行过程:
    第一阶段的目的是让嵌入式系统能正常运行起来,并为第二阶段以及随后操作系统内核的运行准备好基本的硬件环境,包括硬件初始化和板级初始化。使用汇编语言实现。
    第二阶段代码使用C语言实现,以便实现操作系统加载的功能。包括建立系统配置信息交互通道和映像下载通道、校验内核映像、解压内核映像、解压缩内核映像、复制内核映像到RAM、为内核执行提供合适的上下文环境等。

    4、设备驱动程序

    设备驱动程序的功能:设备初始化、设备打开(激活)和关闭、设备读取和写入(数据收发)、设备状态查询和设备控制操作

    5、实时系统

    定义:对外界的响应是否正确不仅取决于功能的正确性,还取决于对事件处理的时间正确性。
    时限是实时系统追求的最重要指标,分为相对时限和绝对时限。相对时限是允许的最大时间长度,绝对时限是任务必须完成的时刻。
    实时系统中的运行的任务可以根据时限对系统性能的影响程度分为3中类型:硬实时任务、软实时任务、准实时任务。
    实时系统的几个关键特性:时间约束性、可预测性、可靠性、交互性。

    6、实时操作系统

    概念:实时操作系统是不以在给定时间内完成更多的任务为目标,而是以响应外部事件尽可能快且响应时间具有确定性为目标的操作系统。
    实时操作系统最为关键的特性就是完成每一次任务所需的时间的一致性。完成每次任务所需时间的偏差称为抖动。

    7、实时操作系统的实时性指标

    与任务切换和中断延迟时间有关的参数是衡量实时操作系统性能的最重要指标。
    中断延迟时间: 是指从接收到可屏蔽中断请求信号到操作系统作出响应并转入中断服务程序所需要的最长时间。
    任务切换时间: 是操作系统在两个独立且具有相同优先级的就绪态任务之间切换所需要的时间。
    任务抢占时间: 系统将控制权从低优先级的任务转移到高优先级的任务所花费的时间。

    8、嵌入式操作系统的内核结构

    单内核(宏内核)结构:
    把内核的各个功能模块整合在一起,模块之间的交互通过直接调用其他模块中的函数来实现,执行效率高,性能好。这类操作系统内核即单内核或宏内核
    微内核结构:
    仅将必需的基本功能放入内核,它们运行在核心态;其他功能都在内核之外,由在用户态运行的服务来完成,这种做法使得内核的结构很小,所以称为微内核结构。

    9、uC/OS -2嵌入式操作系统的特点

    专门为嵌入式应用设计的实时多任务操作系统内核,具有执行效率高、占用空间少、实时性能优良和可扩展性强等特点。
    公开源代码的高质量实时内核、可移植、可裁剪、时间确定性、多任务、抢占式内核、多种系统服务。

    10、uC/OS -2嵌入式系统的组成

    内核大致划分为任务调度、任务管理、时间管理、任务间同步与通信以及内存管理、系统管理等模块。系统管理又包括系统初始化、系统启动、中断管理、时钟中断及事件处理等部分。
    19--嵌入式基础之系统软件 - 图1

    11、uC/OS -2的任务状态

    19--嵌入式基础之系统软件 - 图2
    休眠态:
    任务代码驻留在内存中但还没有交给内核调度的状态。调用创建任务函数可以把任务提交给内核管理。
    就绪态:
    任务已经具备运行条件但因优先级比正在运行的任务低而暂时不能运行的状态。
    运行态:
    任务已经获得处理器使用权而正在运行的状态。任何时刻系统中只有一个任务处于运行状态。
    等待态:
    正在运行的任务因等待某一事件发生而将处理器的使用权出让给其他任务而将自身挂起的状态。
    被中断态:
    因处理器执行中断服务程序而被暂停运行的任务状态。

    12、uC/OS -2的中断服务程序执行步骤

    1.保存全部CPU寄存器;
    2.调用OSIntEnter( )或OSIntNesting直接加1;
    3.执行用户中断服务代码(调用中断处理函数);
    4.调用OSIntExit( );
    5.恢复所有CPU寄存器;
    6.执行中断返回指令。