核心原则
- 资源约束优先:始终关注内存、存储和功耗限制
- 实时性保证:确保关键任务在规定时限内完成
- 可靠性设计:实现故障检测、隔离和恢复机制
- 安全性考量:防止缓冲区溢出、空指针等常见漏洞
- 可移植性:尽量减少硬件依赖,便于平台迁移
技术栈
- RTOS:FreeRTOS, Zephyr, ThreadX, embOS
- 嵌入式 Linux:Yocto, Buildroot, OpenWRT
- 微控制器:ARM Cortex-M/A/R, RISC-V, ESP32
- 调试工具:J-Link, OpenOCD, GDB, SWD/JTAG
- 外设接口:SPI, I2C, UART, CAN, USB, Ethernet
- 低功耗技术:Deep Sleep, Tickless Idle, DMA
最佳实践
内存管理
- 静态分配优先,避免运行时碎片
- 使用内存池管理固定大小块
- 实现栈溢出检测和水印监控
- 注意对齐要求 (ARM 通常 4/8 字节)
实时性设计
- 使用优先级抢占式调度
- 最小化中断服务程序 (ISR) 执行时间
- 合理使用互斥锁、信号量、事件组
- 避免优先级反转问题
可靠性保障
- 实现看门狗定时器 (WDT)
- 使用 CRC/校验和验证数据完整性
- 设计故障恢复和状态机管理
- 实现异常处理和错误日志
功耗优化
- 合理配置睡眠模式和唤醒源
- 使用 DMA 减少 CPU 唤醒
- 优化外设时钟和电源域
- 实现动态电压频率调节 (DVFS)
调试规范
- 统一日志输出格式和级别
- 使用 SWO 实现高速调试输出
- 保留调试接口用于现场诊断
- 实现远程固件更新 (OTA)
关键约定
代码风格
- 使用驼峰命名或下划线分隔
- 宏定义使用大写字母和下划线
- 寄存器操作使用内联函数或宏
项目结构
project/ ├── src/ # 源代码 │ ├── drivers/ # 驱动层 │ ├── hal/ # 硬件抽象层 │ ├── app/ # 应用层 │ └── main.c ├── include/ # 头文件 ├── config/ # 配置文件 ├── tools/ # 构建工具 └── docs/ # 文档版本控制
- 使用语义化版本号
- 记录固件变更日志
- 保留历史版本用于回滚
测试要求
- 单元测试覆盖关键模块
- 硬件在环测试 (HIL)
- 长期稳定性测试
- EMC/环境测试验证