2013-10-31 357 views
2

我想在位置0x3FF802放置一個函數void loadableSW(void)。在另一個函數residentMain()中,我將使用指向函數的指針跳轉到此位置。如何聲明函數 loadableSW來完成此操作。爲了清楚起見,我附上了residentMain的骨架。如何在C中的特定地址放置一個函數?

更新:目標硬件是TMS320C620xDSP。由於這是一個航空航天項目,確定性行爲是一個理想的設計目標。理想情況下,他們想知道什麼部分的內存包含特定時間的內容。我剛纔知道的解決方案是在鏈接器文件的內存中定義一個節。該部分應從0x3FF802(放置函數的位置)開始。由於loadableSW函數的大小是已知的,因此也可以確定內存部分的大小。然後指令#pragma CODESECTION ("function_name", "section_name")可以將該函數放置在指定的部分。

由於編譯指示不允許在測試腳本中使用,所以我想知道是否有其他方法可以在不使用任何鏈接器指令的情況下執行此操作。

除了我很好奇。 C++中是否有函數的放置語法?我知道有一個對象,但功能?

void residentMain (void) 
    { 
     void (*loadable_p) (void) = (void (*) (void)) 0x3FF802; 
     int hardwareOK = 0; 

     /*Code to check hardware integrity. hardwareOK = 1 if success*/ 

     if (hardwareOK) 
     { 
      loadable_p(); /*Jump to Loadable Software*/ 
     } 
     else 
     { 
      dspHalt(); 
     } 
    } 
+1

您需要將功能置於預定地址的原因是什麼? – Agentlien

+0

您將不得不使用地圖文件。你在做什麼嵌入式系統? – RedX

+1

你在哪個平臺上? – texasbruce

回答

0

我不知道你的OS /工具鏈/ IDE,但下面的答案應該工作:

How to specify a memory location at which function will get stored?

還有就是我知道的只是一種方式,它在顯示第一個答案。

UPDATE

如何定義gcc的部分:

變量: http://mcuoneclipse.com/2012/11/01/defining-variables-at-absolute-addresses-with-gcc/

方法(部分( 「部分名稱」)):http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html#Function%20Attributes

+0

這不是IAR特有的嗎? – Agentlien

+0

@Agentlien是的,但這是我唯一知道的,因爲你沒有指定任何有關環境......請檢查更新 – asalic

+0

@Susanta:是的,我正在尋找這樣的事情。唯一的問題是編譯器不是gcc。這是CL55。但是,謝謝。我將再次閱讀該手冊以獲取類似的功能。 –

0

如何在C中的特定地址放置一個函數?

由於編譯指示不允許在測試腳本中使用,所以我想知道是否有其他方法可以在不使用任何鏈接器指令的情況下執行此操作。

如果你的目標支持PC相對解決,你可以確保它是,那麼你可以使用一個memcpy()搬遷程序。

How to run code from RAM...對此有一些提示。如果你不能生成個人電腦相對/可重定位代碼,那麼你絕對不能在鏈接器的幫助下做到這一點。這是一個鏈接器/加載程序的定義,以修復地址。

這可以帶你到一個不同的概念。不要完全鏈接你的代碼。相反推遲地址修復直到加載。然後,您必須編寫一個加載程序以在運行時放置代碼;但從您的航空航天項目評論,我認爲複雜性和分析也很重要,所以我不相信你會接受。您還需要將存儲空間加倍等。

+0

請參閱[David Salomon的彙編程序和加載程序](http://www.davidsalomon.name/assem.advertis/asl.pdf)以獲取彙編程序,加載程序和鏈接程序的參考/解釋。 –