将一款产品从停产的旧单片机迁移到STM32中,原项目使用外部 EEPROM 存储大量配置参数,能有几百 KB。这些参数以每页 1KB 的形式存储,且每页的格式都不相同。
移植到STM32时必须保持完全相同的存储格式来保存这些配置。
举个例子:页 0 偏移地址 0 存储一个 uint8_t 类型的产品类型;偏移地址 1 存储一个 uint16_t 类型的产品子类型;偏移地址 3 存储另一个 uint16_t 变量,以此类推。
必须为每个变量指定绝对固定的存储位置,因为系统会在开机时从 EEPROM 加载配置到 RAM,关机时再从 RAM 写回 EEPROM。同时还有一个上位机软件用于修改这些配置:软件会直接告知单片机,我要读取页 0 偏移地址 1 的 uint16_t 变量,或者向这个地址写入数值 2。
所以,要让整套系统正常工作,所有变量的地址都必须提前定义且绝对固定不变。
在旧单片机上,我们可以直接这样写:
uint8_t product @0;
uint16_t product_subtype @1;
uint16_t product_subtype_2 @3;
之后我们只需要一个简单的 for 循环,就能在 RAM 和 EEPROM 之间批量读写整个配置区,上位机也是同样的逻辑。
在stm32上如何实现这样的寻址,之前的编译器 / 链接器不需要修改任何 .ld 链接脚本就能实现这个功能。
|
|