2013-03-01 43 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。