我目前正在尝试了解 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 引导程序将其复制到 0x2600 0000 而 0x2000 0000 是 DDR 的起始地址)。
- 有谁知道一个很好的教程,它准确地解释了这一步(从 at91 引导程序跳转到我的应用程序)?
我可能可以回答自己的另一个问题:
- 是否可以安全地假设我不需要在我的应用程序开始时执行 board_startup.s 中的指令,这些指令启用浮点单元,设置 sys 堆栈指针等等。我会说硬件本身已经由 AT91 Bootstrap 设置,因此不需要这样的设置。
考虑了几件事后,它归结为:
- 告诉链接器它应该将 main 链接到地址 0x0 是否有意义(因为这是引导程序将跳转到的地方) - 我该怎么做?