2013-03-01 46 views
-2

我有用于AT91sam9 ARM控制器的AT91Bootloader。我需要添加一些额外的硬件初始化,但我只编译了.bin文件。 我装bin文件到内存,并试图把它叫做:arm(裸机):调用二进制文件作为函数

((void (*)())0x00005000)(); 

但是,没有任何结果。尽可能少使用汇编程序。我之前被介绍过汇编程序,但由于它的共谋性,无法理解ARM汇编程序。我怎么能从bootloader中间调用,执行bin文件(它会在某个内存扇区中,例如0x00005000),然后返回到bootloader并继续执行它自己的代码?

+1

给出的信息太少。顺便说一句,如果你正在调用的函数没有被编译和链接在地址0x5000处执行,上述可能不起作用(我不认为这个二进制文件只包含位置无关的代码)。 – 2013-03-01 10:44:55

回答

1

ARM程序集是一个比较简单的程序,非常简单。如果你想继续做裸机,你至少需要学习一些组件。例如了解阿列克谢的评论。

你正在寻找的指令是BX,它转移到一个地址,则需要跳转到代码的引导程序下载的组件:

.globl tramp 
tramp: 
    bx r0 

的C语言是

void tramp (unsigned int address); 

正如在评论中提到的,程序需要编译的地址是你运行它的地址和/或它需要位置独立,否则它不会工作。此外,您需要使用适当的入口点构建应用程序,如果它是原始二进制文件,并且您转到加载二进制文件的地址,则需要通过使二进制文件中的第一个字成为该二进制文件来启动二进制文件执行的入口点。

也明白,一个精灵格式文件包含你想要加载的数据,但作为一个整体不是你想要加载的数据。它是一个“二进制文件”,但是为了运行包含在其中的程序,您需要解析并提取可加载部分并将它们加载到正确的位置。

如果你不知道这些术语是什么意思,使用谷歌,和/或搜索SO,答案就在那里。

2

如果ARM asm“太复杂”,您会发现很难调试您遇到的任何问题。基本* ARM汇编是我遇到的复杂汇编语言的至少之一。

你的代码应该工作(尽管我不会在那里使用硬编码的地址),前提是“.bin”格式正确。常见问题:

  • 入口点应该是ARM代码;一些编译器默认为Thumb。有可能(如果有点棘手)让Thumb代码起作用。
  • 入口点需要位于文件的开头。没有反汇编,很难判断你是否正确地做了这件事。
  • 链接器将在必要时插入“thunk”(又名“stubs”)。在一些连接器中的怪癖意味着thunk可以在之前放置的入口点。您可以使用--stub-group-size=-1(docs here)解决此问题。

*忽略你不需要入门的东西,如Thumb/VFP/NEON。