#### 一、基础优化方法
1. **关键字优化**
- **`static`**:减少栈操作,优化函数内联(示例:`static int counter = 0;`)。
- **`inline`**:小函数内联展开(示例:`inline int add(int a, int b)`)。
- **`const`**:常量存入Flash,减少RAM占用(示例:`const uint32_t baud_rate = 115200;`)。
- **`volatile`**:强制访问实际地址(示例:`volatile uint8_t flag = 0;`)。
2. **内存与结构体优化**
- **字节对齐**:通过`#pragma pack(n)`或`__attribute__((aligned(n)))`对齐结构体(示例:4字节对齐)。
- **堆内存规避**:优先使用静态变量,避免`malloc/free`碎片化。
- **DMA传输**:外设数据搬运由DMA完成(如SPI/UART大数据传输)。
3. **算法与指令优化**
- **位运算替代乘除**:`a << 3`代替`a * 8`。
- **查表法(LUT)**:预计算复杂函数(如正弦表)。
- **循环展开**:减少分支预测开销(示例:手动展开4次循环)。
- **浮点转定点**:使用Q格式(如Q15)替代浮点运算。
---
#### 二、进阶优化策略
1. **低功耗与时钟管理**
- **动态调频**:根据负载调整CPU主频。
- **休眠模式**:空闲时进入Stop/Standby模式(通过WFI/WFE唤醒)。
- **外设时钟开关**:禁用闲置外设时钟(如`__HAL_RCC_ADC_CLK_DISABLE()`)。
2. **代码结构与外设优化**
- **避免深层嵌套**:使用状态机拆分复杂逻辑。
- **批量数据传输**:合并SPI/I2C小数据包,减少中断次数。
- **GPIO位带操作**:直接操作寄存器提升效率(如STM32的`GPIOx_BSRR`)。
3. **编译器与链接优化**
- **O3优化级别**:启用编译器最高优化(Keil/O3)。
- **删除未使用代码**:通过`-ffunction-sections`和`--gc-sections`移除冗余代码。
- **内联汇编**:核心算法手写汇编优化(如FFT)。
---
#### 三、RTOS环境下的优化
1. **任务与调度优化**
- **优先级分配**:高优先级任务短小精悍,低优先级任务可阻塞。
- **静态内存分配**:任务栈、队列使用预定义数组(示例:FreeRTOS静态任务创建)。
- **事件标志组**:替代多个信号量,减少上下文切换。
2. **中断与通信优化**
- **ISR轻量化**:仅标记事件,复杂逻辑移交任务处理(示例:`xSemaphoreGiveFromISR()`)。
- **队列批量发送**:单次发送结构体而非多字段(示例:`xQueueSend()`)。
- **避免优先级反转**:使用优先级继承的互斥量。
3. **内核配置与监控**
- **裁剪非必要功能**:关闭未使用的定时器、统计模块(配置`FreeRTOSConfig.h`)。
- **Tickless模式**:空闲时暂停系统节拍中断(配置`configUSE_TICKLESS_IDLE`)。
- **资源监控工具**:`uxTaskGetStackHighWaterMark()`检测栈溢出。
---
#### 四、硬件与系统级优化
1. **硬件加速器利用**
- **FPU/DSP指令**:Cortex-M7的浮点与矩阵运算加速。
- **硬件CRC/加密模块**:替代软件计算,提升速度与能效。
- **DMA链式传输**:自动搬运多块内存(如摄像头数据)。
2. **系统级策略**
- **电源域隔离**:关闭未用模块电源(如闲置传感器接口)。
- **固件差分升级**:仅传输差异部分,减少OTA数据量。
- **双Bank Flash设计**:实现无缝固件更新。
---
### 五、核心优化原则总结
1. **空间换时间**:查表法、预计算、硬件加速减少实时计算。
2. **时间换空间**:压缩数据、复用缓冲区、静态分配降低内存需求。
3. **硬件协同**:DMA、低功耗模式、外设模块减轻CPU负担。
4. **RTOS轻量化**:裁剪内核功能、静态资源分配、任务解耦。
**实施建议**:
- 通过性能分析工具(如Keil Event Recorder)定位瓶颈。
- 结合具体场景选择优化组合(如高实时性系统侧重中断与任务优先级)。
- 兼顾功耗与性能平衡(如动态调频与休眠模式)。