本文是《STM32 模块化开发实战指南》第 7 篇,聚焦于模块可移植性设计。我们将探讨如何让同一个模块在裸机、RTOS、甚至 PC 模拟环境下无缝运行,并结合 Makefile 条件编译、平台抽象接口、Mock 替换策略等方法,提升项目的重用性和适配能力。
一、为什么要支持多平台复用?
真实开发中,我们可能面临:
-
BLE 协议栈需在 RTOS 项目中集成
-
中间件模块需在 Linux 测试工具中运行
-
组件代码在 STM32、ESP32 等多个芯片中复用
✅ 如果你希望构建“通用模块”,让它脱离 MCU 平台、操作系统依赖,跨项目使用,多平台复用就是必要设计目标。
二、模块设计原则:抽象 + 解耦 + 条件编译
-
抽象:不直接访问平台资源,而是通过接口或回调间接操作
-
解耦:不依赖 HAL、FreeRTOS、裸机的特定实现
-
条件编译:通过宏控制平台相关功能启用或替换
三、平台适配层设计:platform.h
建议为每个平台定义一组抽象接口,如下:
// platform.h
#ifndef PLATFORM_H
#define PLATFORM_H
#include <stdint.h>
void platform_log(const char *fmt, ...);
uint32_t platform_millis(void);
void platform_delay_ms(uint32_t ms);
#endif
-
在裸机下通过 SysTick 实现
-
在 RTOS 中使用
osDelay
、xTaskGetTickCount()
-
在 PC 模拟环境用
printf()
、gettimeofday()
等替代