前言
之前的文章留下一个问题:flash超过16位的地址空间(32KB )后,flash驱动因使用uint32_t指令而不能运行。
其实还有一个问题:通过ram复制的flash驱动,当时是可以用的,一旦boot修改了,flash驱动也有可能变化。
原因
STM8使用uint32_t时,调用了lib,lib编译在flash上,且位置不固定,因此修改boot后,lib可能发生位置变化,因此flash驱动也发生变化
解决方案
将uint32_t的指令二进制提取出来,放到ram中,flash驱动直接跳转到ram上地址。
(1)函数不使用优化:#pragma optimize=none
(2)编译后,有警告(加优化就有三个了)
这2个就是调用的lib,可以在map中定位到
定位之后,把二进制提取出来
debug的时候,查看汇编窗口,定位到驱动函数,找到调用这2个lib的地方
二进制表现是CD XX XX,CD表示call XXXX表示地址
因此我们把这2个call的地址修改一下即可
假设驱动定位到0x1500的地址上,驱动长度是0xBA, 可以把?add32_l0_l0_l1的二进制接到驱动后面,因此?add32_l0_l0_l1的地址就是0x15BA,这样CD97D4就可以修改为CD15BA,同理可以设置?mul32_l0_l0_l1,这样就脱离了lib的依赖,可以解决lib编译后地址不确定,需要修改驱动的问题。
经测试方案有效
注意
以上内容是本人一知半解的情况下,解决问题的下下之策,仅供参考。