AT91 Bootstrap +裸机应用

时间:2014-03-19 10:08:51

标签: c bare-metal

我目前正在尝试了解AT91和裸机应用程序如何协同工作。我会试着描述一下我的内容:

  • IAR作为开发环境
  • 一个简单的应用程序,我可以通过调试器下载到SRAM并切换一些LED(工作!)
  • 使用SAM-BA我可以将此应用程序写入SRAM并且它将正确启动(LED正在切换)
  • 我的硬件平台是ATSAMA5D3x-EK

现在我希望这个应用程序首先运行AT91引导程序来初始化所有低级硬件(如DDR-RAM),然后跳转到我的应用程序并运行它。我还没能成功地做到这一点。我能够启动预先构建的uboot二进制文件,所以我认为不是复制或跳转失败但我的应用程序设置不正确。

据我了解,如果我跳转到一个应用程序(我假设这是某种“LDR pc,appstart_address”),地址appstart_address的操作就会被执行。

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

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

  • AT91初始化硬件并跳转到我的应用程序后会发生什么
  • 我是否需要以某种特定方式设置我的应用程序?我是否需要告诉链接器或任何其他组件它将被重定位到其他内存位置(at91 bootstrap将其复制到0x2600 0000而0x2000 0000是DDR的起始地址)。
  • 有没有人知道一个很好的教程,它解释了这个步骤(从at91 bootstrap到我的应用程序的跳转)?

我可能会回答一个问题:

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

在考虑了一些事情后,它归结为:

  • 告诉链接器它应该将main链接到地址0x0是否有意义(因为这是bootstrap将跳转到的地方) - 我该怎么做?

1 个答案:

答案 0 :(得分:1)

  

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

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

重置向量不希望直接显示主要暗示C代码,您没有设置堆栈或任何您需要做的事情来调用C代码。此外,复位向量通常足够接近使用分支b而不是ldr pc,但由于您只有一个字/指令可以离开异常表,因此它需要是分支或ldr pc。

如果您的二进制文件是位置相关的,那么您为该位置构建它,然后您可以将它放在非易失性存储中,复制并运行,如果您不喜欢它。如果你为它的非易失性地址构建它,但你在不同的地址空间中运行它并且它不是位置独立的那么你是对的它根本就不会工作。

  

AT91初始化硬件并跳转到我的硬件后会发生什么   应用

您的应用程序运行

  

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

要么独立建立位置,要么将其链接到将运行的地址。

  

有没有人知道一个很好的教程,可以解释这个步骤   (从at91 bootstrap跳转到我的应用程序)?

我假设当你说at91 bootstrap(需要使用更正确的术语)时,你的意思是某些特定的部分(at91是一个长寿命的设备系列)你真的是指一些atmel部分特定代码或IAR部分特定代码。您的问题的答案在他们的示例或文档中。在发布类似问题之前,您需要演示您找到的内容,示例等。

  

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

如果您依赖别人的代码来设置ddr,那么他们设置堆栈可能是一个安全的选择。 fpu,那是另一个故事。但是,如果该文件名特定于他们的项目并且是他们调用/使用的东西那么好,他们调用或使用它。再一次,这是特定于这个神奇的AT91 Bootstrap的东西,你没有证明你看过,看过或读过。请对这个主题做一些更多的研究,展示你尝试过的东西等等。例如,在这个引导代码之后读取启用fpu的寄存器或者只是使用它并看看你看到的内容应该是非常简单的。这是一个简单的方法来判断它是否已经运行。或者在该代码中插入一个无限循环,并在代码挂起无限循环时重新构建。他们正在运行它。 (注意不要用这样的动作给你的电路板砖块,理论上SAM-BA会让你重新加载)。

  

告诉链接器它应该将main链接到是否有意义   地址0x0(因为这是bootstrap将跳转到的地方) - 怎么会   我这样做?

此处理器的异常表位于一个众所周知的位置(可能是两个中的一个,具体取决于捆绑)。异常处理程序需要在正确的位置才能使处理器正常启动。通常情况下,链接器会对代码进行最终排列,并且链接器特定于如何告诉链接器将内容放在哪里,因此答案在链接器的文档中,并且在项目的某个位置指定了此信息(链接器脚本,makefile等)或默认值使用全局默认值或某个变量或命令行选项告诉其中一个工具查找此信息。所以你如何做是阅读文档,并做文档所说的。