gpt4 book ai didi

arm - 了解 ARM Cortex-M0+ 重定位

转载 作者:行者123 更新时间:2023-12-04 20:12:40 27 4
gpt4 key购买 nike

我刚刚开始进行嵌入式 arm 开发,有一段代码真的让我很烦恼:

/* Initialize the relocate segment */
pSrc = &_etext;
pDest = &_srelocate;

if (pSrc != pDest)
{
while (pDest < &_erelocate)
{
*pDest++ = *pSrc++;
}
}

哪里 _etext_srelocate是链接描述文件中定义的符号:
. = ALIGN(4);
_etext = .;

.relocate : AT (_etext)
{
. = ALIGN(4);
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);
. = ALIGN(4);
_erelocate = .;
} > ram

哪里 ram是一个内存段,它的原点是 0x20000000 .我看到的问题是 _etext是标记 .text 结束边界的符号段,它是不同内存段的一部分, rom .这意味着除非前面提到的内存段是 100% 满的,否则 _etext != _srelocate永远是真的。这意味着我们正在复制超出 .text 的内存。根据链接器脚本没有定义任何内容的部分。

对我来说,这会导致以下三种情况之一: A) rom 中存在垃圾超越 .text部分,它被复制到 .relocate (随后 .data ),或 B)超出 .text 的内存在器件编程之前的芯片删除操作之后为空,在这种情况下 .relocate归零,或 C) 这里发生了一些轻微的手魔法,其中 .data值放在 .text 之后在 rom ,并且必须加载到 ram ;在这种情况下,评论应该是 s/relocate/data .

第三种情况似乎最有可能,但根据链接描述文件,这不可能是真的。有人可以对此有所了解吗?

最佳答案

你是对的,这是第三种选择。 AT() 告诉链接器放置 .ramfunc .data 目标文件中从 开始的部分(两者都是读/写) _etext . "> ram"告诉链接器解析重定位,就像将部分放置在 RAM 中一样,这是使用 MEMORY 命令完成的,如下所述:https://sourceware.org/binutils/docs/ld/MEMORY.html#MEMORY结果是复制循环在程序启动时将数据从只读区移动到读/写区。

这是 gnu ld 文档的链接,其中描述了控制 LMA(加载地址):https://sourceware.org/binutils/docs/ld/Output-Section-LMA.html

关于arm - 了解 ARM Cortex-M0+ 重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41314085/

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