最近在折腾一个bootloader,里面使用的flash 擦除和编程函数不能放在目标MCU程序空间。
具体步骤可参考文章:
Bootloader升级方式一————擦、写flash在RAM中运行_bootloader flash擦写代码拷贝到ram-优快云博客
问题出在最后,将擦除和编程函数对应的代码数据,添加到数组中,在目标MCU运行出错。尽管注意到了不使用全局变量,仍然无法正确运行。跟踪汇编,发现以下问题:
而原生擦写函数,寄存器的变化如下:
从上面代码运行情况可以看出,想要代码在其他上下文环境中也能正常运行,需要产生与位置无关的代码,并且禁止在Code中访问Data。 勾选no data reads in code memory,编译后bin体积变大,应该是将所使用的常量数据也增加到Code中了。
不同设置产生的bin对比,勾选后代码体积增大: