系统知识 · 嵌入式系统
嵌入式是软硬结合的系统工程:裸机开发、中断与定时器、RTOS 任务调度、交叉编译全链路。
知识简介
嵌入式系统 面向特定功能、资源受限(内存 KB 级、无操作系统或轻量 RTOS)。核心能力:寄存器级外设控制、中断响应、实时性保证、交叉编译部署。
核心概念
- 裸机 vs RTOS:裸机用主循环+中断;RTOS 提供任务调度、信号量、队列。
- 中断:外设事件异步通知 CPU,ISR 要短小,只置标志位、不做耗时操作。
- 定时器:硬件计数器溢出触发中断,用于延时、PWM、看门狗。
- 交叉编译:x86 主机编译 ARM 目标(arm-none-eabi-gcc),用 OpenOCD/J-Link 烧录。
- 看门狗:程序跑飞时定时喂狗失败即复位,保障系统自恢复。
代码示例:裸机定时器 + 中断(伪代码)
c
/* 以 STM32 定时器中断为模板 */
void TIM2_IRQHandler(void) {
if (TIM2->SR & TIM_SR_UIF) {
TIM2->SR &= ~TIM_SR_UIF; /* 清中断标志 */
flag_tick_1ms = 1; /* ISR 只置标志 */
}
}
void main_loop(void) {
while (1) {
if (flag_tick_1ms) {
flag_tick_1ms = 0;
/* 非实时任务放主循环处理 */
update_led();
}
}
}代码示例:RTOS 任务与信号量(FreeRTOS)
c
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
SemaphoreHandle_t sensor_sem;
void sensor_task(void *p) {
for (;;) {
read_sensor(); /* 模拟采集 */
xSemaphoreGive(sensor_sem); /* 通知处理任务 */
vTaskDelay(pdMS_TO_TICKS(100));
}
}
void process_task(void *p) {
for (;;) {
if (xSemaphoreTake(sensor_sem, portMAX_DELAY) == pdTRUE) {
process_data(); /* 收到信号再处理 */
}
}
}
void app_main(void) {
sensor_sem = xSemaphoreCreateBinary();
xTaskCreate(sensor_task, "sensor", 128, NULL, 2, NULL);
xTaskCreate(process_task, "proc", 128, NULL, 1, NULL);
vTaskStartScheduler();
}学习路径
- 用 STM32CubeMX + HAL 库点亮 LED、跑通串口打印。
- 加定时器中断与外部按键中断,理解中断优先级。
- 移植 FreeRTOS,用信号量与队列重写采集任务。
- 最后做一个小项目:温湿度采集 + OLED 显示 + 串口上报。
来源参考
GitHub 关键词:FreeRTOS-Kernel、stm32-hal-examples、embedded-c-tutorial(链接可替换为实际仓库地址)。