我有一種特殊類型的FLASH存儲器中的皮質M3一部分。這部分在這個FLASH上啓動,但我需要運行一個函數來優化FLASH的速度。要做到這一點的唯一方法是跳轉到RAM並在那裏執行這些功能(因爲如果在它正在優化的FLASH上運行,該功能將會崩潰)。重新定位臂立方厘米彙編代碼猛撞
ARM允許分散加載。這是一個解決方案,因爲我可以將這個函數放入RAM中,並在我進入main時運行它們。但我不想執行FLASH的所有分散加載未優化。所以我想在main之前運行該函數,這意味着從重置處理程序或SystemInit(從重置處理程序調用)。
我已經寫了分別位於ROM一些組件的功能。在啓動時,我調用我編寫的Relocate函數,然後將其他函數複製到RAM中,然後跳轉到它們。這是行得通的。
我的問題是:
- 這聽起來是不是瘋了嗎?有沒有更簡單的方法來實現這一點(無需等待分散加載)?
在.s文件,我有,我會重新定位的功能。要使用這些重定位函數,我加載PROC標籤,然後減去(FLASH - RAM)的偏移量。這不感覺便攜。是否有另一種方法來計算重定位函數的正確PROC地址? 例如:
foo PROC ... ... ENDP
富在ROM中開出的0x24000000處,我需要把它爲0x8000移到RAM。有沒有辦法可以聲明foo生存在0x8000,即使它必須存儲在ROM中?還是有辦法聲明foo_reloc住在0x8000?這也適用於THUMB代碼,因爲foo可能從0x24000001開始,需要在0x8001處調用。
感謝, Nachum
我沒有武器分散加載鉤跳出我的功能被移動後。我使用的是Keil工具,分散加載是自動完成的。 沒有分散加載,有沒有更好的方法來編寫我正在編寫的彙編函數?也許是一種告訴彙編程序我正在重新定位特殊程序的方法,而不是計算補償? 有沒有人有任何例子? – nachum
我已經更新了我的答案,詳細介紹瞭如何手動執行分散加載。 –