我正在尝试从Cortex-M3处理器(STM32)上的RAM执行一个函数.该功能擦除并重写内部闪存,所以我肯定需要在RAM中,但我该怎么做?
我试过的是:使用memcpy将函数复制到RAM中的字节数组(检查它是否正确对齐),将函数指针设置为指向字节数组然后调用函数(指针).
这可能适用于10条指令(我可以跟随调试器的执行),但随后我收到一个buss错误,处理器重置.第二次通过循环时发生总线错误,因此代码应该没问题(因为它在第一次传递时起作用).我认为更快的RAM访问会以某种方式破坏总线时序......
无论如何有一个正确的方法来做到这一点?分散文件如何将函数自动放入RAM中(我正在使用Keil uVision for Cortex-M3)?
编辑:更多信息:工具链:RealView MDK-ARM V 4.10编译器:Armcc v4.0.0.728汇编程序:Armasm v4.0.0.728链接器:ArmLink v4.0.0.728处理器:STM32F103ZE
发生复位时,IMPRECISERR位在总线故障寄存器中置1.
循环迭代时的崩溃可能是因为函数分支到绝对地址而不是相对于RAM中的新函数位置.由于闪存擦除操作,在那一点访问原始代码位置会导致总线错误吗?
我相信你可以通过将__ram指令附加到函数定义来标记要使用CARM正确编译和复制到RAM 的函数.有关如何对RealView编译器执行相同操作的说明,请参阅RAM中的EXECUTING FUNCTIONS技术支持文章:
μVision允许您将模块定位到对话框项目 - 选项 - 目标中输入的特定存储区域.为此,请右键单击源文件(或文件组),然后打开" 选项 - 属性 "对话框.然后在Memory Assignment下选择内存区域.
文件夹ARMExamplesRAM_Function中有一个示例.
这应该生成启动代码,以便将函数复制到RAM并正确地将调用链接到该位置.否则,如果需要将任意函数动态复制到RAM,请查看使用RealView 编译位置无关代码(PIC).