用途
该技能提供嵌入式软件开发方面的专业能力,专注于 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。