gpt4 book ai didi

c - 如何从 Cortex-M3 (STM32) 上的 RAM 执行功能?

转载 作者:太空狗 更新时间:2023-10-29 17:08:00 26 4
gpt4 key购买 nike

我正在尝试从 Cortex-M3 处理器 (STM32) 上的 RAM 执行一个函数。该函数删除并重写内部闪存,所以我肯定需要在 RAM 中,但我该怎么做?

我尝试过的是:使用 memcpy 将函数复制到 RAM 中的字节数组(检查它是否正确对齐),将函数指针设置为指向字节数组,然后调用函数(指针)。

这可能适用于 10 条指令(我可以使用调试器跟踪执行),但随后出现总线错误并且处理器重置。总线错误发生在第二次通过循环时,因此代码应该没问题(因为它在第一次通过时有效)。我认为更快的 RAM 访问会以某种方式破坏总线时序......

有没有正确的方法来做到这一点?分散文件看起来如何自动将函数放入 RAM(我正在为 Cortex-M3 使用 Keil uVision)?

编辑:更多信息:工具链:RealView MDK-ARM V 4.10编译器:Armcc v4.0.0.728汇编器:Armasm v4.0.0.728链接器:ArmLink v4.0.0.728处理器:STM32F103ZE

当重置发生时,IMPRECISERR 位在总线故障寄存器中设置。

最佳答案

循环迭代时的崩溃可能是因为该函数分支到一个绝对地址,而不是相对于 RAM 中的新函数位置。由于闪存删除操作,此时访问原始代码位置会导致总线错误吗?

我相信您可以通过将 __ram 指令附加到函数定义来使用 CARM 将函数标记为要编译并正确复制到 RAM。有关如何使用 RealView 编译器执行相同操作的说明,请参阅 EXECUTING FUNCTIONS IN RAM技术支持文章:

µVision allows you to locate modulesto specific memory areas that areentered in the dialog Project -Options - Target. To do so, rightclick on a source file (or file group)and open the dialog Options -Properties. Then select the memoryregions under Memory Assignment.

There is an example in the folder ARMExamplesRAM_Function.

这应该会生成启动代码,以负责将函数复制到 RAM 并将调用正确链接到该位置。否则,如果您需要将任意函数动态复制到 RAM,请查看编译 position independent code (PIC)使用 RealView。

关于c - 如何从 Cortex-M3 (STM32) 上的 RAM 执行功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3044010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com