一、使用平台
单片机使用的是stm32l051,为了方便在程序中设置每一个的固定id值选择使用绝对定位(__attribute__)关键字
二、故障现象
代码如下:
const u32 CARDID_AT __attribute__ ((at(CARDID_ADDR))) = 1313;
在使用自定义指令触发对CARDID_ADDR地址擦除后改写后,程序可以正常运行,但是当程序复位后,部分程序逻辑混乱,不能正常运行。
三、故障原因
因为设置的CARDID_ADDR地址是程序生成的最后一段地址,因此程序会在这段程序之后自动添加一些程序的配置信息(猜测是配置信息,未具体研究为什么内容),当使用擦除指令后将此地址所在扇区一同清除了,导致配置信息丢失。因此重启后导致单片机工作不正常。
四、解决办法
每次在写入前。将当前扇区数据读出。将要修改的数据写入缓存,再更新整个扇区,至此问题解决!