如何實現(xiàn)變量的絕對定位
CDK編譯環(huán)境使用了GNU C Complier,簡稱GCC。GCC使用ld腳本對代碼對象進行鏈接,將多個輸入文件整合成一個輸出文件。
在一些特殊的場合,我們需要對代碼中的一些內(nèi)容實現(xiàn)精確的定位。
這里我們分兩個方面來介紹,分別是變量的絕對定位和函數(shù)(代碼段)的絕對定位。
假設(shè)要實現(xiàn)將wData[] 放到程序存儲區(qū) 0x9000的位置。需要做以下兩個操作
1. 首先在代碼文件中,將變量歸入某個section,這個例子里是FlashData段。
__attribute__((section(".FlashData"))) const uint32_t wData[] = {0x1, 0x2}; //在這種絕對定位的情況下,關(guān)鍵字 const 不是必須的。
< /FONT >
< P > 2. 其次,要對ld文件進行修改。增加以下內(nèi)容,將FlashData段起始地址定位在0x9000。
.FlashData 0x9000:
{
. = ALIGN(0x4)
;
*(.FlashData)
*(.FlashData.*)
} > ROM
再重新編譯,就可以在map文件上看到:
有時候,會希望有一些代碼可以快速取址并運行。其中一個實現(xiàn)的方法是把函數(shù)定位到RAM區(qū)。
假設(shè)要實現(xiàn)將function() 放到RAM。需要做以下兩個操作:
1. 首先在代碼文件中,將函數(shù)歸入某個section,這個例子里是codeinram段。
__attribute__((section(".codeinram"))) void function1(void);
2. 其次,要對ld文件進行修改。
1、如果拿到的庫程序第一次編譯報錯,錯誤提示如下:
這是因為庫發(fā)布時帶了一些編譯選項,點擊CDK“清除”快捷按鈕清除一下工程,再重新編譯即可。