2013-07-03 21 views
0

這裏是我的程序的nm轉儲。如何將main()重定位到0x00000000?

00000000 T __ctors_end 
00000000 T __ctors_start 
00000000 T __dtors_end 
00000000 T __dtors_start 
00000000 a __tmp_reg__ 
00000000 T __trampolines_end 
00000000 T __trampolines_start 
00000000 T setup 
00000001 a __zero_reg__ 
0000003d a __SP_L__ 
0000003e a __SP_H__ 
0000003f a __SREG__ 
00000072 T __vector_15 
00000086 T main 
000000a8 A __data_load_end 
000000a8 A __data_load_start 
000000a8 T _etext 
00800100 D _edata 
00800100 T _end 
00810000 T __eeprom_end 

架構是AVR,我需要得到的main()回升到00000000,以便我正在運行此代碼的正確執行的芯片。它應該像鏈接腳本一樣簡單,不是嗎?

+0

你確定要在'0x00000000'處設置'main'嗎?我見過的AVR文檔說第一個代碼運行的是從256B到4KB的引導加載程序,然後它將跳轉到主程序。 – lurker

+0

嗯,'0x00000000'是我需要'main()'在二進制文件中的地址,因爲我在刷新二進制文件以'256B'開始,以節省編程時間。但是,謝謝你的觀察。 –

+0

好的謝謝澄清。通常情況下,用於寫入閃存的文件格式(例如Intel Hex或S Record)將目標地址考慮在內,並且它應該與文件中的地址無關。聽起來像你正在直接創建一個二進制圖像文件。如果你當前的文件主要從該文件中的地址256開始,那麼前256個字節是什麼?在您的系統上編程256個字節需要多少編程時間?這應該是非常快的。 – lurker

回答

0

沒關係,其中main()在內存中。只需將jump指令寫入復位向量中的地址或應用程序存儲器中的0x0000即可。

0

我曾經爲AVR編程,因爲我知道更改main()條目的唯一方法是熔絲位。但是你可以放在FLASH的引導程序後面。根據芯片主要在不同的地方開始,我不知道,但在AVR它應該是像0x200x100

這是因爲在開始時有RESET向量,寄存器和中斷向量。 這個結構非常有幫助,一旦我有一個項目,我無法使用看門狗,所以觸發重置的唯一方法是溢出。

此外,我已閱讀您的評論。你不需要把一些寄存器(AVR寄存器分爲一個是SRAM,其他FLASH)和中斷向量的地方的256位字節0x00,所以如果你使用可以說定時器或UART和你的代碼開始於0x00因此這些初始化會破壞你的代碼。

它的設計工作,我認爲重新設計會破壞。但是如果你真的想要這個,你可以嘗試添加-Ttext=0x0000這個標誌。 這可能會編譯它,但我不建議這麼做。

+0

'-Ttext = 0x0000'因爲'main()'不在文本部分的開始處不起作用,'setup()'這就是爲什麼它在數值轉儲的main()從'nm'。但是,好的。我有興趣充分利用'AVR'體系結構,所以告訴我你是怎麼想的,我可以利用閃存的第一個'256B'在任何可能的地址跳轉到'main()'在。 –

+0

@GeorgeMorgan首先,我想問問你有什麼芯片和你使用的編譯器。 – ST3

+0

我實際上最終解決了我的問題,通過在禁用指向啓動引導加載程序地址的保險絲後,在0x000處將'jump()()'命令加入到'main()儘管謝謝您的幫助! –

相關問題