SuperAPI AI 工具集

embedded-systems

编程与开发

查看项目

更新于 10-15 11:08

技能介绍

用途

该技能提供嵌入式软件开发方面的专业能力,专注于 RTOS、裸机固件和嵌入式 Linux。其重点包括安全关键代码、功耗优化,以及面向微控制器(STM32、ESP32)和嵌入式 Linux 系统的硬件抽象。

适用场景

  • 为微控制器(STM32、NXP、ESP32)编写固件
  • 配置实时操作系统(Zephyr、FreeRTOS)
  • 开发传感器/外设驱动(I2C、SPI、UART)
  • 构建嵌入式 Linux 系统(Yocto、Buildroot)
  • 实现 OTA(空中下载)更新机制
  • 分析崩溃转储或调试硬件故障(JTAG/SWD)

决策框架

操作系统选型

根据硬件能力进行选择:

  • 微控制器(MCU)— RAM 小于 1MB:
    • 硬实时需求 → Zephyr / FreeRTOS(抢占式调度器)
    • 安全关键 → SafeRTOS / Rust(裸机)
    • 简单循环 → 裸机(超级循环)
  • 微处理器(MPU)— RAM 大于 64MB:
    • 复杂 UI / 网络 → 嵌入式 Linux(Yocto/Buildroot)
    • 硬实时需求 → RT-Linux(PREEMPT_RT)或双核方案(Linux + MCU)

语言选择(2026 标准)

  • C(C11/C17):用于遗留代码 / HAL,仍占主导地位,建议使用严格的静态分析(MISRA)。
  • C++(C++20):用于复杂逻辑,嵌入式场景使用 noexcept、禁用 rtti,追求零成本抽象。
  • Rust:用于新项目,强烈推荐,无 GC 的内存安全,使用 embedded-hal。
  • MicroPython:用于原型验证,适合快速测试,不适合生产环境的实时需求。

更新策略(OTA)

  • 双 Bank(A/B):安全,但需要 2 倍 Flash 空间。
  • 压缩镜像:节省 Flash,但解压需要 RAM。
  • 增量更新:带宽占用最小,但补丁逻辑复杂。

危险信号(应升级至安全工程师)

  • 生产设备中 JTAG 端口保持开放
  • 安全启动密钥以明文形式存储在代码中
  • 固件更新未签名(仅做完整性校验,无真实性验证)
  • 在 C 代码中使用 strcpy 或无界缓冲区

工作流示例:Zephyr RTOS 应用

目标:通过 I2C 读取传感器并打印到控制台。

步骤一:设备树(app.overlay)

&i2c1 {
    status = "okay";
    bme280@76 {
        compatible = "bosch,bme280";
        reg = <0x76>;
        label = "BME280";
    };
};

步骤二:配置(prj.conf)

CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_CBPRINTF_FP_SUPPORT=y

步骤三:代码(main.c)

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>

void main(void) {
    const struct device *dev = DEVICE_DT_GET_ANY(bosch_bme280);
    
    while (1) {
        sensor_sample_fetch(dev);
        struct sensor_value temp;
        sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp);
        printk("Temp: %d.%06d C\n", temp.val1, temp.val2);
        k_sleep(K_SECONDS(1));
    }
}

模式与模板

模式一:状态机(裸机)

用例:在没有操作系统的情况下处理复杂的设备逻辑。

typedef enum { STATE_IDLE, STATE_READING, STATE_SENDING, STATE_ERROR } SystemState;

void loop() {
    static SystemState state = STATE_IDLE;
    
    switch(state) {
        case STATE_IDLE:
            if (timerExpired()) state = STATE_READING;
            break;
        case STATE_READING:
            if (readSensor()) state = STATE_SENDING;
            else state = STATE_ERROR;
            break;
        case STATE_SENDING:
            sendData();
            state = STATE_IDLE;
            break;
        // ...
    }
}

模式二:中断延迟处理

用例:保持 ISR(中断服务例程)简短。

  • ISR:设置标志或将数据推入环形缓冲区,立即返回。
  • 主循环 / 任务:检查缓冲区/标志并处理数据(例如解析 GPS NMEA 字符串)。
  • 原因:过长的 ISR 会阻塞其他中断并导致系统崩溃。

模式三:看门狗喂狗

用例:系统卡死时自动复位。

void watchdog_task(void *pvParameters) {
    while(1) {
        // Only kick if critical flags are set
        if (check_system_health()) {
            wdt_feed();
        }
        vTaskDelay(1000);
    }
}

集成模式

与 iot-engineer 协作

  • 交接:嵌入式工程师编写驱动(I2C)→ IoT 工程师编写 MQTT 逻辑。
  • 协作:功耗预算(无线电唤醒频率)。
  • 工具:Power Profiler。

与 mobile-app-developer 协作

  • 交接:嵌入式工程师实现 BLE GATT 服务端 → 移动端开发者实现客户端。
  • 协作:定义 GATT 服务/特征 UUID。
  • 工具:nRF Connect。

与 cloud-architect 协作

  • 交接:嵌入式工程师实现 OTA 代理 → 云架构师实现更新服务器(S3/签名 URL)。
  • 协作:安全令牌格式(JWT/X.509)。
  • 工具:AWS IoT Jobs。