嵌入式系统软件组成

无操作系统的嵌入式应用软件

无操作系统的嵌入式应用软件采用单任务程序实现系统功能,此单任务程序通常由一段用汇编语言编写的启动代 BootLoader 和用高级语言(如 C、C++等)编写的驱动程序和系统应用程序组成

![[images/Pasted image 20260111192342.png]]

包含操作系统的嵌入式应用软件

![[images/Pasted image 20260111192408.png]]

初始化引导程序 BootLoader

微控制器上电后,无法从硬件上定位 main 函数的入口地址,所以每一种微控制器(处理器)都必须有初始化引导程序。初始化引导程序负责微控制器从“复位”到“开始执行 main 函数”中间这段启动过程

Cortex-M4 内核的启动代码可以有以下三种执行模式。

  • 通过 boot 引脚设置可以将中断向量表定位于 SRAM 区,即起始地址为 0x2000000,同时复位后 PC 指针位于 0x2000000 处
  • 通过 boot 引脚设置可以将中断向量表定位于用户 Flash 区,即起始地址为 0x8000000,同时复位后 PC 指针位于 0x8000000 处
  • 通过 boot 引脚设置可以将中断向量表定位于内置 Bootloader 区 (Mask ROM/Flash)

板级支持包 BSP

概念

BSP 是嵌入式系统的基础部分,也是实现系统可移植性的关键。它负责上电时的硬件初始化、启动 RTOS 或应用程序模块、提供底层硬件驱动,为上层软件提供访问底层硬件的支持

![[images/Pasted image 20260111192554.png]]

重要性

嵌入式软件的运行从上电复位就开始启动,首先进行板级初始化,然后再执行系统引导及应用程序初始化等过程

![[images/Pasted image 20260111192626.png]]

BSP 和 BIOS

  • PC 中的引导加载程序由 BIOS(Basic Input Output System,BIOS)和位于硬盘 MBR 中的 BootLoader 程序组成。
    • BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 BootLoader 读到系统的 RAM 中然后将控制权交给 OS 的 BootLoader 程序。
    • BootLoader 的主要任务是将操作系统内核映象从硬盘读入 RAM 中,然后跳转到内核入口点去运行,从而开始操作系统的运行。
  • BIOS 不包含设备驱动程序,而 BSP 却包含;
  • BIOS 的代码是在芯片生产过程中固化的,一般来说开发者无法修改;但开发者程序员却可以修改 BSP,即可以在 BSP 中根据需要任意添加一些和应用相关但与系统无关的硬件设备驱动程序,还可以根据需要修改初始化代码

设备驱动程序

设备驱动程序是一种可以使应用软件和硬件外设进行交互的特殊程序,它把具体外设的硬件功能,抽象成软件命令接口,应用程序只需调用这个接口,便可控制硬件设备的工作

库函数

库函数实现了对底层寄存器操作的封装,它由一系列完成系统 I/O、数据处理操作的 API 组成。MCU 生产厂商在推出微控制器时,也同时提供了一套完整细致的库函数开发包,里面包含了在 MCU 开发过程中所涉及的所有底层操作

嵌入式系统软件设计方法

前后台系统

对基于芯片的开发来说,应用程序一般是一个无限的循环,可称为前后台系统或超循环系统

![[images/Pasted image 20260111192809.png]]

中断(事件)驱动系统

嵌入式系统的中断是一种硬件机制,用于通知 CPU 发生了异步事件

中断一旦被识别,CPU 保存部分(或全部)上下文即部分或(全部)寄存器的值,然后 CPU 跳转到专门的子程序去执行,该子程序被称为中断服务子程序(ISR)。

中断服务子程序做事件处理,处理完成后,主程序将按如下情况进行执行:

  • 在前后台系统中,程序回到后台程序
  • 对非占先式内核而言,程序回到被中断了的任务
  • 对占先式内核而言,让进入就绪态的优先级最高的任务开始运行

巡回服务系统

当嵌入式微处理器/微控制器的中断源不多时,可以采用软件的方法实现由主循环完成对外部事件的处理,即把软件设计成巡回服务系统。这样即使嵌入式微处理器没有中断源也可以完成软件的设计。

巡回服务系统要处理多个任务时,要使用状态机设计方法。使用 switch() case 结构来实现步骤处理和状态迁移。

基于定时器的巡回服务系统

巡回服务系统中的处理器总是处于全速运行的状态,能耗较高。若系统的外部事件发生不是很频繁,可以降低处理器服务事件的频率,这样既不会影响响应速度,又节省了能耗,即采用一种基于定时器驱动的巡回服务方法

嵌入式 Linux

嵌入式 Linux(Embedded Linux)是指对标准 Linux 经过小型化裁剪处理之后,能够固化在容量只有几 KB 或者几 MB 字节的存储器芯片(如 Flash)或者单片机中,适合特定嵌入式应用场合的专用 Linux 操作系统。嵌入式 Linux 为了更好地适应嵌入式领域的开发,还在 Linux 基础上做了不少改进

  • 改善内核结构
  • 提高系统实时性

开发流程

  • 安装交叉编译器
  • 交叉调试
  • 建立引导装载程序 BootLoader
  • 下载移植好的 Linux 操作系统
  • 建立根文件系统
  • 建立应用程序的 Flash 磁盘分区
  • 开发应用程序

归类为 4 个层次:

  • 建立引导加载程序:包括固化在固件(Firmware )中可选的 boot 代码和 BootLoader 两大部分
  • 移植 Linux 内核:设定嵌入式板子的定制内核以及内核的启动参数
  • 建立文件系统:包括根文件系统和建立在 Flash 设备之上的文件系统
  • 开发应用程序:特定的用户应用程序,有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面