系统知识 · 嵌入式系统

嵌入式是软硬结合的系统工程:裸机开发、中断与定时器、RTOS 任务调度、交叉编译全链路。

系统知识 技术栈:C / RTOS / ARM 来源:GitHub 参考

知识简介

嵌入式系统 面向特定功能、资源受限(内存 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();
}

学习路径

  1. 用 STM32CubeMX + HAL 库点亮 LED、跑通串口打印。
  2. 加定时器中断与外部按键中断,理解中断优先级。
  3. 移植 FreeRTOS,用信号量与队列重写采集任务。
  4. 最后做一个小项目:温湿度采集 + OLED 显示 + 串口上报。

来源参考

GitHub 关键词:FreeRTOS-Kernelstm32-hal-examplesembedded-c-tutorial(链接可替换为实际仓库地址)。