Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C AT91引导程序+;裸金属应用_C_Bare Metal - Fatal编程技术网

C AT91引导程序+;裸金属应用

C AT91引导程序+;裸金属应用,c,bare-metal,C,Bare Metal,我目前正试图了解AT91和裸机应用程序如何协同工作。我将试着描述我所拥有的: IAR作为开发环境 一个简单的应用程序,我可以通过调试器下载到SRAM,并切换一些LED(工作!) 使用SAM-BA,我可以将此应用程序写入SRAM,它将正确启动(LED正在切换) 我的硬件平台是ATSAMA5D3x EK 现在,我希望这个应用程序首先运行AT91引导程序来初始化所有底层硬件(如DDR-RAM),然后跳转到我的应用程序并运行它。我还没能成功地做到这一点。虽然我能够启动预构建的uboot二进制文件,但

我目前正试图了解AT91和裸机应用程序如何协同工作。我将试着描述我所拥有的:

  • IAR作为开发环境
  • 一个简单的应用程序,我可以通过调试器下载到SRAM,并切换一些LED(工作!)
  • 使用SAM-BA,我可以将此应用程序写入SRAM,它将正确启动(LED正在切换)
  • 我的硬件平台是ATSAMA5D3x EK
现在,我希望这个应用程序首先运行AT91引导程序来初始化所有底层硬件(如DDR-RAM),然后跳转到我的应用程序并运行它。我还没能成功地做到这一点。虽然我能够启动预构建的uboot二进制文件,但我认为失败的不是复制或跳转,而是我的应用程序设置不正确

据我所知,如果我跳转到一个应用程序(我假设这是某种“LDR pc,appstart_地址”),地址appstart_地址处的操作就会执行

现在,在ARM中,前7个字节左右是为中止/中断向量保留的,而第一条指令通常是某种“LDR pc,=main”。如果我的应用程序被复制到RAM并从那里执行,这些是必需的吗?我有一种感觉,在将我的应用程序复制到RAM之后,地址指针不再匹配了(尽管它们应该是相对的,对吗?)

所以我的问题基本上可以归结为:

  • AT91初始化硬件并跳转到我的应用程序后会发生什么
  • 我是否需要以某种特定的方式设置我的应用程序?我是否需要告诉链接器或任何其他组件它将被重新定位到其他内存位置(at91引导将其复制到0x26000000,而0x2000 0000是DDR的起始地址)
  • 有谁知道一个很好的教程能准确地解释这一步(从at91引导到我的应用程序的跳转)
还有一个问题我可能可以自己回答:

  • 可以安全地假设,我不需要在应用程序开始时执行board_startup.s中的指令,这些指令启用浮点单元、设置sys堆栈指针等等。我想说的是,硬件本身已经由AT91引导设置,因此不需要这样的设置
在考虑了一些事情后,可以归结为:

  • 告诉链接器它应该将main链接到地址0x0(因为这是引导程序将跳转到的地方)有意义吗?我该怎么做
现在,在ARM中,前7个字节左右保留用于中止/中断 向量,而第一条指令通常是某种“LDR” pc,=主”。如果我的应用程序被复制到RAM和 从那里处决?我有一种感觉,在抄袭了我的 应用到RAM,地址指针不再匹配 (尽管它们应该是相对的——这是正确的吗?)

前8个单词是异常入口点yes。其中一个是未定义的,所以有7个是真实的

重置向量不希望直接转到main,这意味着C代码,您还没有设置堆栈或调用C代码所需的任何操作。此外,重置向量通常非常接近,可以使用分支b而不是ldr pc,但由于只有一个字/指令可以从异常表中取出,因此它需要是分支或ldr pc,等等

如果您的二进制文件依赖于位置,那么您可以为该位置构建它,然后您可以将其放置在非易失性存储中,如果您愿意,可以复制并运行它—这没有问题。如果您为它的非易失性地址构建它,但您在不同的地址空间中运行它,并且它不是位置独立的,那么您是对的,它根本不起作用

AT91初始化硬件并跳转到我的 应用

您的应用程序正在运行

我是否需要以某种特定的方式设置我的应用程序?我需要吗 告诉链接器或任何其他组件它将被重新定位到 其他一些内存位置(at91引导)将其复制到0x26000000 而0x2000 0000是DDR的起始地址)

要么独立构建它,要么将它链接到它将运行的地址

有谁知道一个很好的教程能准确地解释这个步骤吗 (从at91引导到我的应用程序的跳转)

我假设当你说at91引导(需要使用一个更正确的术语)时,你指的是某些特定于部件的(at91是一个长寿命的设备系列),你真正指的是某些特定于atmel部件的代码或特定于IAR部件的代码。你的问题的答案在他们的例子或文档中。在发布这样的问题之前,你需要展示你的发现、例子等

假设我不需要执行指令是否安全 在我的应用程序开始时的board_startup.s中启用 浮点单元,设置sys堆栈指针等。我会的 假设硬件本身已经由AT91引导设置 因此不需要这样的设置

例如,如果您依赖其他人的代码来设置ddr,那么他们很可能会设置堆栈。fpu,那是另一个故事。但是如果这个文件名是特定于他们的项目的,并且是他们调用/使用的,那么他们调用或使用它。同样,这是特定于这个神奇的AT91引导的东西,你没有证明你看过,通过或阅读有关。请对此主题进行更多的研究,展示您的尝试,等等。例如,在这个引导代码之后,读取启用fpu的寄存器,或者只是使用它,看看您看到了什么,应该是非常简单的。这是一个判断它是否运行过的简单方法。或者,在代码中插入一个无限循环,如果代码挂起在inf上,则重新构建