assembly 将arm cm3汇编代码从闪存重定位到RAM

iqih9akk  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(135)

我有一个Cortex M3部件,带有一个特殊类型的闪存。器件在此闪存上启动,但我需要运行一个函数来优化闪存的速度。唯一的方法是跳转到RAM并在那里执行这些函数(因为如果在正在优化的FLASH上运行该函数,则该函数将崩溃)。
ARM允许分散加载。这是一个解决方案,因为我可以把函数放在RAM中,一旦我到达main就运行它们。但我不想在FLASH未优化的情况下执行所有分散加载。所以我想在main之前运行函数,这意味着从reset处理程序,或者从SystemInit(从reset处理程序调用)。
我已经写了一些汇编函数,这些函数位于ROM中。在 Boot 时,我调用我编写的Relocate函数,然后将其他函数复制到RAM,然后跳转到它们。这是工作。
我的问题是:
1.这听起来很疯狂吗有没有更简单的方法来完成这个任务(不用等待分散加载)?
1.在.s文件中,我将重新定位一些函数。为了使用这些重新定位的函数,我加载PROC标签,然后减去(FLASH - RAM)的偏移量。感觉不像是便携式的。是否有其他方法为重新定位的函数计算正确的PROC地址?举例来说:

foo     PROC
        ...
        ...
        ENDP

字符串
foo从ROM的0x 24000000开始,我需要将它移动到RAM的0x 8000。有没有一种方法可以声明foo位于0x 8000,即使它必须存储在ROM中?或者有没有一种方法可以声明foo_reloc在0x 8000上?这也适用于THUMB代码,因为foo可能从0x 24000001开始,需要在0x 8001处调用。
谢谢你,纳查姆

relj7zay

relj7zay1#

1.不,这不疯狂。
1.不要担心重定位,链接器应该会为您处理所有这些。
把你的flash配置函数放到分散文件中的一个单独的执行区域。然后,您唯一需要做的就是修改分散加载代码,首先为您的flash配置函数设置执行区域,然后调用它,然后继续其他区域的分散加载。
像这样使用散点文件:

LR 0x0
{
    ROM 0x0
    {
      * (+RO)
      * (+RW,+ZI)
    }

    RAM 0x18000 0x8000
    {
        foo.o (*)
    }
}

字符串
然后你应该得到一个图像,它以这样的开头:

$a
!!!main
__main
    0x00000000:    eb000000    ....    BL       __scatterload ; 0x8
    0x00000004:    eb000028    (...    BL       __rt_entry ; 0xac


您可以使用“神奇的”链接器符号(如“Image$$RAM$$Base”)编写自己的scatterloader,手动执行RO,RW和ZI的加载(只需在链接器命令行上设置自己的“entry”符号以绕过默认的分散加载器),然后调用__rt_entry。
由于Keil工具实际上是ARM工具,您可以在此处查看更多信息。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0101a/armlink_chdcgbjd.htm

相关问题