我正在尝试在Cortex-M3处理器(STM32)上从RAM执行一个函数。该函数擦除并重写内部闪存,因此它必须位于RAM中,但我该如何做呢?
我尝试的方法是:使用memcpy将函数复制到RAM中的字节数组中(检查其是否正确对齐),设置函数指针指向该字节数组,然后调用函数(指针)。
这对于大约10条指令(我可以通过调试器跟踪执行)运行良好,但是然后我会收到总线错误并且处理器会重置。总线错误发生在循环的第二次通过时,因此代码应该没问题(因为第一次通过时它能够正常工作)。我认为更快的RAM访问以某种方式混乱了总线时序...
无论如何,有没有正确的方法来做这件事?如何编写一个scatter文件以自动将函数放置在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位被设置。
我尝试的方法是:使用memcpy将函数复制到RAM中的字节数组中(检查其是否正确对齐),设置函数指针指向该字节数组,然后调用函数(指针)。
这对于大约10条指令(我可以通过调试器跟踪执行)运行良好,但是然后我会收到总线错误并且处理器会重置。总线错误发生在循环的第二次通过时,因此代码应该没问题(因为第一次通过时它能够正常工作)。我认为更快的RAM访问以某种方式混乱了总线时序...
无论如何,有没有正确的方法来做这件事?如何编写一个scatter文件以自动将函数放置在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位被设置。