前言
之前的文章留下一个问题: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编译后地址不确定,需要修改驱动的问题。
经测试方案有效
注意
以上内容是本人一知半解的情况下,解决问题的下下之策,仅供参考。
本文探讨了解决STM8微控制器中使用uint32_t导致的lib库地址不固定问题,通过提取并放置到RAM中关键函数的二进制代码,避免驱动依赖于编译后的lib位置。作者分享了具体步骤和注意事项,包括禁用优化、定位lib地址、二进制提取和地址修改等技巧。
&spm=1001.2101.3001.5002&articleId=124287418&d=1&t=3&u=a622fb0ed9be4e0a84d26b49e430b436)
1874

被折叠的 条评论
为什么被折叠?



