如何實現變量的絕對定位
CDK編譯(yi)環境使用了GNU C Complier,簡(jian)稱(cheng)GCC。GCC使用ld腳本對(dui)(dui)代碼對(dui)(dui)象進行鏈接(jie),將多個(ge)(ge)輸入文(wen)件整合成(cheng)一個(ge)(ge)輸出文(wen)件。
在一(yi)些(xie)特殊的(de)場合,我們需要對代碼中的(de)一(yi)些(xie)內容(rong)實現精確的(de)定(ding)位。
這里我們分兩個方面來介紹(shao),分別是變量的絕對定(ding)(ding)位(wei)和函數(代碼(ma)段)的絕對定(ding)(ding)位(wei)。
假設要(yao)實現將(jiang)wData[] 放到程序(xu)存儲區 0x9000的位置。需要(yao)做以下兩個操作
1. 首先在(zai)代(dai)碼文件中,將變量歸入某個section,這(zhe)個例(li)子里是FlashData段(duan)。
__attribute__((section(".FlashData"))) const uint32_t wData[] = {0x1, 0x2}; //在這種絕(jue)對定(ding)位的情(qing)況下(xia),關(guan)鍵字 const 不是必須的。
< /FONT >
< P > 2. 其次,要對ld文件進行修改。增加以下內容,將(jiang)FlashData段起始地址定位(wei)在(zai)0x9000。
.FlashData 0x9000:
{
. = ALIGN(0x4)
;
*(.FlashData)
*(.FlashData.*)
} > ROM
再(zai)重(zhong)新(xin)編譯,就可以在map文件上看到(dao):
有時候,會希望有一些代碼可以快速取址并運行。其中一個實(shi)現的方(fang)法是把(ba)函(han)數定位(wei)到RAM區(qu)。
假設要實現將function() 放到RAM。需要做以下兩個操作:
1. 首(shou)先在代碼文件(jian)中,將函數歸入某(mou)個(ge)section,這個(ge)例子里是codeinram段。
__attribute__((section(".codeinram"))) void function1(void);
2. 其次,要對ld文(wen)件進行修(xiu)改。
1、如果拿到(dao)的庫程序(xu)第一次編譯報錯,錯誤提(ti)示如下:
這是(shi)因為庫發布時帶了一(yi)些編譯(yi)(yi)選項,點擊CDK“清(qing)除(chu)”快捷按鈕清(qing)除(chu)一(yi)下工(gong)程,再重新編譯(yi)(yi)即(ji)可。