我正在尝试从 Cortex-M3 处理器 (STM32) 上的 RAM 执行函数。该函数会擦除并重写内部闪存,所以我肯定需要在 RAM 中,但我该怎么做呢?
我尝试过的是:使用 memcpy 将函数复制到 RAM 中的字节数组(检查它是否正确对齐),设置函数指针指向字节数组,然后调用函数(指针)。
这对于大约 10 条指令来说效果很好(我可以使用调试器跟踪执行情况),但随后我收到总线错误并且处理器重置。总线错误发生在第二次通过循环时,因此代码应该没问题(因为它在第一次通过时有效)。我认为更快的 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 位被置位。
循环迭代时崩溃可能是因为该函数分支到绝对地址,并且与 RAM 中的新函数位置无关。由于闪存擦除操作,此时访问原始代码位置是否会导致总线错误?
我相信您可以通过附加以下内容来使用 CARM 正确标记要编译并复制到 RAM 的函数__ram
指向函数定义的指令。有关如何使用 RealView 编译器执行相同操作的说明,请参阅执行 RAM 中的函数技术支持文章:
µVision 允许您定位模块
到特定的内存区域
在对话框中输入项目 -
选项 - 目标。这样做就对了
单击源文件(或文件组)
并打开对话框选项 -
特性。然后选择内存
下的地区内存分配.
文件夹中有一个例子ARM 示例RAM_Function.
这应该生成启动代码来负责将函数复制到 RAM 并将调用正确链接到该位置。否则,如果您需要动态地将任意函数复制到 RAM,那么请考虑编译位置无关代码 (PIC)与 RealView。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)