gpt4 book ai didi

arm - Arm Rom.ld,Ram.ld,scatterfile,startup.s,所有这些文件都做什么?

转载 作者:行者123 更新时间:2023-12-02 05:34:26 25 4
gpt4 key购买 nike

我已经编程了avr微控制器,但是对arm还是陌生的。我只是看了winarm随附的sam7s64的示例代码。我对这些文件rom.ld,ram.ld,分散文件,cstartup.s文件感到困惑。我在编写avr时从未见过此类文件。请澄清我的疑问,每个文件的作用。

最佳答案

我还有更多样本供您思考http://github.com/dwelch67

假设您有一个支持特定指令集的工具链。工具经常尝试支持不同的实现。您的微控制器可能具有X数量的闪存和Y数量的内存。一个芯片可能将ram与另一个芯片放在不同的地方,等等。指令集可能是相同的(或者本身可能有细微的变化),以便工具链对某些指令进行编码,最终它想知道您的内存布局是什么是。通常,可以为某些纯粹与位置无关的处理器编写代码,尽管这不一定是目标,因为这会增加成本。工具也倾向于对事物采用统一的方法。从源语言到目标文件(尚不知道其内存布局),它留下了一些漏洞供以后填充。您可以根据工具链和指令集从不同的语言中获取信息,也许将ada和C以及其他编译为对象的语言混合使用。然后,链接器需要合并所有这些内容。作为程序员,您有时可以控制什么地方。您希望向量表在正确的位置,您希望输入代码在特定的位置,您绝对希望ram中的.data最终是Flash中的.text。

对于gnu工具,您可以使用链接描述文件告诉链接器事情在哪里,其他工具链可能具有其他方法。使用gnu ld,您还可以使用ld命令行...您所看到的.ld文件可以控制它。现在有时这埋藏在工具链安装的大肠中,有一个默认位置可以找到默认的链接描述文件,如果可以的话,您就无需编写链接描述文件并将其随项目一起使用。根据您在avr上使用的工具,您可能不需要弄乱它(正在使用汇编,avra或可以通过.org或其他类似语句控制它的东西),或者工具链/沙盒会为您处理,它被掩埋了(例如,使用arduino沙箱)。例如,如果您编写一个hello world程序

#include <stdio.h>
int main ( void )
{
printf("Hello World!\n");
return(0);
}


并在您的台式机/笔记本电脑上进行编译

gcc hello.c -o hello


有一个链接描述文件,可能是一个讨厌的,可怕的,丑陋的脚本。但是,由于您对操作系统的默认链接器脚本和布局感到满意,因此您无需将其弄乱,它就可以正常工作。对于一个工具链可以支持大量芯片和供应商的微控制器,您必须开始处理这一问题。最好不要将链接程序脚本与项目保持在一起,因为您不知道它们是从一台机器或一个人到另一台机器或某个人的确切的gnu交叉编译器,如果您要创建可在许多gnu交叉编译器上安装的项目,则不难在项目中保留一些内容,而不是强迫它们进入工具链。

其中的另一半,特别是与gnu工具一起,与链接程序脚本密切相关的是启动代码。在调用C程序之前,有一些期望。例如,.data就位,.bss已清零。对于微控制器,您希望将.data保存在非易失性存储器中,以便在启动C程序时将其保存在其中,因此它需要在闪存中,但是由于.data被读/写,因此无法从那里运行,因此请在入口点之前的C代码称为,您需要将.data从flash复制到ram中的适当位置。链接描述文件描述了在Flash中保留.data的位置以及在ram中复制该位置的位置。您可以使用所需的启动代码来命名启动代码,可以在启动阶段填充变量,以便代码可以将.data复制到ram,可以将.bss清零。设置堆栈指针,以便有一个堆栈(C需要工作的另一个项目),然后该代码调用C入口点。对于其他任何高级语言也是如此,如果其他所有人都不需要堆栈指针,那么您就需要一些启动代码。

如果您看一些我的示例,您还将看到我也在做avr处理器的链接描述文件和启动代码。

关于arm - Arm Rom.ld,Ram.ld,scatterfile,startup.s,所有这些文件都做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10766154/

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