【单片机】嵌入式系统的硬件与软件特性
嵌入式系统的软件结构
嵌入式系统的软件结构一般分为 不带操作系统(Bare Metal) 和 带操作系统(RTOS / Linux) 两种。不同的软件架构适用于不同的应用场景,如 简单控制系统、实时控制系统、物联网、工业自动化等。
嵌入式软件结构可以分为不带 OS(裸机)和带 OS(RTOS / Linux)两种,裸机系统适用于简单任务,代码直接运行在 MCU 上,RTOS 适用于多任务管理,提高系统稳定性和可扩展性。
1. 不带 OS 的嵌入式软件结构(Bare Metal)
概述:不带操作系统的软件架构通常应用于 单片机(MCU),运行简单的任务,程序直接控制硬件。如 Arduino、STM32(无 RTOS)、AVR、8051、PIC 等。
软件结构:
+------------------+
| 应用程序 | 用户编写的功能代码
| Application |
+------------------+
| 设备驱动 | 控制外设,如 GPIO、UART、SPI
| Driver |
+------------------+
| 硬件(MCU) | 处理器、存储器、外设
+------------------+
特点:1. 程序直接运行在硬件上,没有操作系统的调度;2. 代码简单,执行效率高; 3. 适用于小型嵌入式设备(如 8-bit、32-bit MCU); 4. 缺乏多任务管理,任务间靠循环或中断实现。
应用场景:
📌 传感器采集
📌 LED 控制、电机驱动
📌 简单串口通讯(UART、I2C、SPI)
📌 低功耗 IoT 设备(如无线传感器节点)
示例代码(裸机 LED 闪烁 - STM32):
int main(void) {
HAL_Init(); // 初始化 MCU
GPIO_Init(); // 初始化 GPIO
while (1) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
HAL_Delay(500); // 延时 500ms
}
}
2. 带 OS 的嵌入式软件结构(RTOS / Linux)
概述:带操作系统的软件架构通常用于 复杂的嵌入式系统(MPU / 高级 MCU),需要多任务处理、实时性、网络通信等功能。
常见的操作系统包括:
- RTOS(实时操作系统):FreeRTOS、RT-Thread、Zephyr
- 嵌入式 Linux:Yocto、Buildroot、Ubuntu Core
软件结构:
+------------------------+
| 应用程序 (Application) | 用户应用,业务逻辑、UI、通信协议
+------------------------+
| 标准 API 层 (API) | 提供标准接口,如 POSIX、CMSIS-RTOS
+------------------------+
| 实时操作系统 (RTOS) | 任务调度、线程管理、定时器
+------------------------+
| 硬件抽象层 (HAL) | 提供硬件驱动接口,如 STM32 HAL
| BSP(Board Support) | 板级支持包,适配不同硬件平台
+------------------------+
| 硬件 (MCU/MPU) | 处理器、存储器、外设
+------------------------+
特点:1. 支持多任务调度(如 FreeRTOS 任务管理);2. 提高系统稳定性(任务隔离,防止崩溃) 3. 适用于复杂嵌入式应用(如 TCP/IP、USB、GUI) 4. 功耗管理更精细。
应用场景:
📌 物联网设备(无线通信、MQTT)
📌 车载系统(仪表盘、导航)
📌 工业控制(PLC、机器人)
📌 智能家居(智能音箱、网关)
示例代码(FreeRTOS 任务调度 - STM32):
void Task1(void *pvParameters) {
while (1) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
vTaskDelay(pdMS_TO_TICKS(500)); // 任务延时 500ms
}
}
int main(void) {
HAL_Init();
xTaskCreate(Task1, "LED_Task", 128, NULL, 1, NULL);
vTaskStartScheduler(); // 启动 FreeRTOS
}
不带 OS vs 带 OS 的对比
对比项 | 不带 OS(Bare Metal) | 带 OS(RTOS / Linux) |
---|---|---|
任务管理 | 通过循环或中断 | 任务调度(多线程) |
实时性 | 高 | 取决于 RTOS 设计 |
复杂度 | 代码简单 | 需要 RTOS 框架 |
功耗管理 | 低功耗,适合小 MCU | 需要 OS 支持 |
应用场景 | 传感器、LED 控制 | 物联网、工业控制 |
如果系统简单(如 LED 控制、UART 通信) → 使用 Bare Metal
如果需要多任务调度、网络功能(如 MQTT) → 使用 RTOS
如果系统复杂(如 Linux + GUI + 网络) → 使用嵌入式 Linux
嵌入式系统的硬件特性
硬件
1. 体积小、集成效率高
嵌入式设备通常体积小,适用于便携式或嵌入式环境
高度集成的 SoC(System on Chip)减少 PCB 设计复杂度
部分系统采用 SIP(System in Package)进一步缩小体积
部分应用:
智能手表(Apple Watch, 华为手表)
物联网传感器(无线温湿度检测)
无人机控制芯片
2. 面向特定的应用
嵌入式系统为特定任务设计,如工业控制、汽车电子、医疗设备
硬件定制化程度高,优化 CPU、存储、通信接口
不需要通用计算能力,而是专注于某项功能
部分应用:
车载 ECU(发动机控制单元)
智能家居(智能门锁、摄像头)
工业 PLC(可编程逻辑控制器)
3. 功耗低、电磁兼容性(EMC)好
嵌入式设备通常采用低功耗架构(如 ARM Cortex-M 系列)
支持低功耗模式(Sleep, Deep Sleep),延长电池续航
优化 PCB 布局,减少 EMI(电磁干扰)和 EMC(电磁兼容)问题
部分应用:
低功耗 IoT 设备(ESP32, STM32L 系列)
医疗植入设备(心脏起搏器)
无线通信模块(LoRa, Zigbee)
嵌入式系统的软件特性
1. 软件开发与硬件紧密相关
嵌入式软件依赖于具体硬件,通常需要驱动开发
不同的 MCU / MPU 需要不同的 BSP(Board Support Package)
与低级硬件交互,如 GPIO、UART、I2C、SPI
示例:STM32 配置 GPIO
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 设置引脚高电平
2. 代码要求高效率和高可靠性
嵌入式系统资源有限(RAM / Flash 小),代码需优化
通常需要实时性,避免延迟和死机
使用 RTOS(如 FreeRTOS)实现任务调度,提高代码可靠性
示例:FreeRTOS 任务调度:
void Task1(void *pvParameters) {
while (1) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
vTaskDelay(pdMS_TO_TICKS(500)); // 500ms 延时
}
}
3. 软件一般固化在 Flash 或 ROM
嵌入式程序存储在 Flash / ROM,而非硬盘
部分设备支持 OTA(Over-the-Air)更新
固件升级需谨慎,避免损坏 Bootloader
示例:STM32 Flash 读取
uint32_t data = *(__IO uint32_t*)FLASH_ADDRESS; // 读取 Flash 数据
4. 具有高实时性
嵌入式系统通常需要实时响应,如汽车刹车系统、工业控制
使用 RTOS(实时操作系统)或裸机(Bare Metal)提高实时性
定时器(Timer)、中断(Interrupt)在嵌入式系统中至关重要
示例:STM32 定时器中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); // 定时器触发 LED 闪烁
}
}
5. 一般采用 C 语言开发
C 语言是嵌入式开发的主要语言,因其高效、可移植性强
部分系统使用 C++(如 Qt GUI)、Python(如 MicroPython)
汇编用于极限优化(如 Bootloader、DSP 算法)
示例:STM32 C 代码
#include "stm32f4xx.h"
int main(void) {
HAL_Init();
while (1) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
HAL_Delay(500);
}
}
嵌入式系统的硬件和软件特点决定了它的高效、低功耗、实时性和可靠性,硬件:小型化、低功耗、面向特定应用;软件:高效、实时、代码固化、多任务管理。在开发中需要合理应用与设计硬件和软件。
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!