2012-11-21 33 views
3

我有一種特殊類型的FLASH存儲器中的皮質M3一部分。這部分在這個FLASH上啓動,但我需要運行一個函數來優化FLASH的速度。要做到這一點的唯一方法是跳轉到RAM並在那裏執行這些功能(因爲如果在它正在優化的FLASH上運行,該功能將會崩潰)。重新定位臂立方厘米彙編代碼猛撞

ARM允許分散加載。這是一個解決方案,因爲我可以將這個函數放入RAM中,並在我進入main時運行它們。但我不想執行FLASH的所有分散加載未優化。所以我想在main之前運行該函數,這意味着從重置處理程序或SystemInit(從重置處理程序調用)。

我已經寫了分別位於ROM一些組件的功能。在啓動時,我調用我編寫的Relocate函數,然後將其他函數複製到RAM中,然後跳轉到它們。這是行得通的。

我的問題是:

  1. 這聽起來是不是瘋了嗎?有沒有更簡單的方法來實現這一點(無需等待分散加載)?
  2. 在.s文件,我有,我會重新定位的功能。要使用這些重定位函數,我加載PROC標籤,然後減去(FLASH - RAM)的偏移量。這不感覺便攜。是否有另一種方法來計算重定位函數的正確PROC地址? 例如:

    foo  PROC 
         ... 
         ... 
         ENDP 
    

富在ROM中開出的0x24000000處,我需要把它爲0x8000移到RAM。有沒有辦法可以聲明foo生存在0x8000,即使它必須存儲在ROM中?還是有辦法聲明foo_reloc住在0x8000?這也適用於THUMB代碼,因爲foo可能從0x24000001開始,需要在0x8001處調用。

感謝, Nachum

回答

5
  1. 不,這不是瘋了。
  2. 不要擔心重定位鏈接器應該照顧你所有的。

把你的閃存配置功能到一個單獨的執行區在分散的文件。然後,您需要做的唯一事情就是修改分散加載代碼,以便先爲Flash配置功能設置執行區域,然後調用它,然後繼續進行其他區域的分散加載。

使用分散文件是這樣的:

LR 0x0 
{ 
    ROM 0x0 
    { 
     * (+RO) 
     * (+RW,+ZI) 
    } 

    RAM 0x18000 0x8000 
    { 
     foo.o (*) 
    } 
} 

然後您應該拿到的東西,如開頭的圖片:

$a 
!!!main 
__main 
    0x00000000: eb000000 .... BL  __scatterload ; 0x8 
    0x00000004: eb000028 (... BL  __rt_entry ; 0xac 

您可以編寫使用「神奇」的鏈接器符號自己scatterloader例如「Image $$ RAM $$ Base」來手動執行RO,RW和ZI的加載(只需在鏈接器命令行上設置您自己的「entry」符號以繞過默認散點加載器),然後調用__rt_entry。

由於Keil的工具是真正的ARM工具,你可以看看這裏的更多信息。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0101a/armlink_chdcgbjd.htm

+0

我沒有武器分散加載鉤跳出我的功能被移動後。我使用的是Keil工具,分散加載是自動完成的。 沒有分散加載,有沒有更好的方法來編寫我正在編寫的彙編函數?也許是一種告訴彙編程序我正在重新定位特殊程序的方法,而不是計算補償? 有沒有人有任何例子? – nachum

+0

我已經更新了我的答案,詳細介紹瞭如何手動執行分散加載。 –