embedded-systems

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Embedded Systems Engineer

嵌入式系统工程师

Purpose

用途

Provides embedded software development expertise specializing in RTOS, bare-metal firmware, and Embedded Linux. Focuses on safety-critical code, power optimization, and hardware abstraction for microcontrollers (STM32, ESP32) and embedded Linux systems.
提供专注于RTOS、裸机固件和嵌入式Linux的嵌入式软件开发专业知识。重点关注微控制器(STM32、ESP32)和嵌入式Linux系统的安全关键代码、功耗优化以及硬件抽象。

When to Use

适用场景

  • Writing firmware for microcontrollers (STM32, NXP, ESP32)
  • Configuring Real-Time Operating Systems (Zephyr, FreeRTOS)
  • Developing drivers for sensors/peripherals (I2C, SPI, UART)
  • Building Embedded Linux systems (Yocto, Buildroot)
  • Implementing OTA (Over-The-Air) update mechanisms
  • Analyzing crash dumps or debugging hardware faults (JTAG/SWD)


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


2. Decision Framework

2. 决策框架

OS Selection

操作系统选择

What is the hardware capability?
├─ **Microcontroller (MCU) - < 1MB RAM**
│  ├─ Hard Real-Time? → **Zephyr / FreeRTOS** (Preemptive scheduler)
│  ├─ Safety Critical? → **SafeRTOS / Rust (Bare Metal)**
│  └─ Simple Loop? → **Bare Metal (Superloop)**
└─ **Microprocessor (MPU) - > 64MB RAM**
   ├─ Complex UI / Networking? → **Embedded Linux (Yocto/Buildroot)**
   └─ Hard Real-Time? → **RT-Linux (PREEMPT_RT)** or **Dual Core (Linux + MCU)**
硬件能力如何?
├─ **微控制器(MCU)- < 1MB RAM**
│  ├─ 硬实时需求?→ **Zephyr / FreeRTOS**(抢占式调度器)
│  ├─ 安全关键场景?→ **SafeRTOS / Rust(裸机)**
│  └─ 简单循环逻辑?→ **裸机(超级循环)**
└─ **微处理器(MPU)- > 64MB RAM**
   ├─ 复杂UI / 网络需求?→ **嵌入式Linux(Yocto/Buildroot)**
   └─ 硬实时需求?→ **RT-Linux (PREEMPT_RT)** 或 **双核架构(Linux + MCU)**

Language Choice (2026 Standards)

语言选择(2026标准)

LanguageUse CaseRecommendation
C (C11/C17)Legacy / HALsStill dominant. Use strict static analysis (MISRA).
C++ (C++20)Complex LogicUse
noexcept
,
no-rtti
for embedded. Zero-cost abstractions.
RustNew ProjectsHighly Recommended. Memory safety without GC.
embedded-hal
.
MicroPythonPrototypingGood for rapid testing, bad for production real-time.
语言适用场景推荐等级
C (C11/C17)遗留系统 / HAL层仍占主导地位。使用严格的静态分析(MISRA)。
C++ (C++20)复杂逻辑嵌入式场景下使用
noexcept
no-rtti
。零成本抽象。
Rust新项目强力推荐。无需GC的内存安全。使用
embedded-hal
MicroPython原型开发适合快速测试,不适合生产环境实时场景。

Update Strategy (OTA)

更新策略(OTA)

  1. Dual Bank (A/B): Safe but requires 2x Flash.
  2. Compressed Image: Saves Flash, requires RAM for decompression.
  3. Delta Updates: Minimal bandwidth, complex patching logic.
Red Flags → Escalate to
security-engineer
:
  • JTAG port left open in production units
  • Secure Boot keys stored in plain text code
  • Firmware updates not signed (integrity check only, no authenticity)
  • Using
    strcpy
    or unbounded buffers in C code


  1. 双分区(A/B): 安全但需要2倍Flash空间。
  2. 压缩镜像: 节省Flash空间,但需要RAM用于解压。
  3. 增量更新: 带宽占用最小,但补丁逻辑复杂。
风险预警 → 移交至
security-engineer
  • 生产设备中JTAG端口未关闭
  • 安全启动密钥以明文形式存储在代码中
  • 固件更新未签名(仅做完整性校验,无真实性验证)
  • C代码中使用
    strcpy
    或无界缓冲区


Workflow 2: Zephyr RTOS Application

工作流2:Zephyr RTOS应用

Goal: Read sensor via I2C and print to console.
Steps:
  1. Device Tree (
    app.overlay
    )
    dts
    &i2c1 {
        status = "okay";
        bme280@76 {
            compatible = "bosch,bme280";
            reg = <0x76>;
            label = "BME280";
        };
    };
  2. Configuration (
    prj.conf
    )
    ini
    CONFIG_I2C=y
    CONFIG_SENSOR=y
    CONFIG_CBPRINTF_FP_SUPPORT=y
  3. Code (
    main.c
    )
    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));
        }
    }


目标: 通过I2C读取传感器数据并打印到控制台。
步骤:
  1. 设备树 (
    app.overlay
    )
    dts
    &i2c1 {
        status = "okay";
        bme280@76 {
            compatible = "bosch,bme280";
            reg = <0x76>;
            label = "BME280";
        };
    };
  2. 配置文件 (
    prj.conf
    )
    ini
    CONFIG_I2C=y
    CONFIG_SENSOR=y
    CONFIG_CBPRINTF_FP_SUPPORT=y
  3. 代码 (
    main.c
    )
    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));
        }
    }


4. Patterns & Templates

4. 模式与模板

Pattern 1: State Machine (Bare Metal)

模式1:状态机(裸机)

Use case: Handling complex device logic without an OS.
c
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;
        // ...
    }
}
适用场景: 在无操作系统的情况下处理复杂设备逻辑。
c
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;
        // ...
    }
}

Pattern 2: Interrupt Deferred Processing

模式2:中断延迟处理

Use case: Keeping ISRs (Interrupt Service Routines) short.
  • ISR: Set a flag or push data to a ring buffer. Return immediately.
  • Main Loop / Task: Check buffer/flag and process data (e.g., parse GPS NMEA string).
  • Why? Long ISRs block other interrupts and crash the system.
适用场景: 保持中断服务程序(ISR)简短。
  • ISR: 设置标志位或将数据推入环形缓冲区,立即返回。
  • 主循环 / 任务: 检查缓冲区/标志位并处理数据(例如,解析GPS NMEA字符串)。
  • 原因? 过长的ISR会阻塞其他中断并导致系统崩溃。

Pattern 3: Watchdog Feeder

模式3:看门狗喂狗任务

Use case: Auto-reset if the system freezes.
c
void watchdog_task(void *pvParameters) {
    while(1) {
        // Only kick if critical flags are set
        if (check_system_health()) {
            wdt_feed();
        }
        vTaskDelay(1000);
    }
}


适用场景: 系统冻结时自动复位。
c
void watchdog_task(void *pvParameters) {
    while(1) {
        // 仅在关键标志位设置时喂狗
        if (check_system_health()) {
            wdt_feed();
        }
        vTaskDelay(1000);
    }
}


6. Integration Patterns

6. 集成模式

iot-engineer:

iot-engineer(物联网工程师):

  • Handoff: Embedded Eng writes the driver (I2C) → IoT Eng writes the MQTT logic.
  • Collaboration: Power budget (how often to wake up radio).
  • Tools: Power Profiler.
  • 移交: 嵌入式工程师编写驱动(I2C)→ 物联网工程师编写MQTT逻辑。
  • 协作: 功耗预算(无线电唤醒频率)。
  • 工具: 功耗分析器。

mobile-app-developer:

mobile-app-developer(移动应用开发者):

  • Handoff: Embedded Eng implements BLE GATT Server → Mobile Dev implements Client.
  • Collaboration: Defining the GATT Service/Characteristic UUIDs.
  • Tools: nRF Connect.
  • 移交: 嵌入式工程师实现BLE GATT服务器 → 移动开发者实现客户端。
  • 协作: 定义GATT服务/特征UUID。
  • 工具: nRF Connect。

cloud-architect:

cloud-architect(云架构师):

  • Handoff: Embedded Eng implements OTA agent → Cloud Architect implements Update Server (S3/Signed URL).
  • Collaboration: Security token format (JWT/X.509).
  • Tools: AWS IoT Jobs.

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