問:如何指定代碼、常數或變量到某個特定的地址?
答:使用“#pragma psect”偽指令來把代碼、常數或變量放到你定制的psect。于是你就可以使用鏈接器選項來把這個定制的psect放到你想要的地址。Pragma psect的語法是:
#pragma psect original_psect=new_psect
這里的“original_psect”是標準的code、constant或變量原來位于的psect名稱,這個orignal psect名稱可以從map文件的symbol table里找到。 一個symbol table的示例:
__Lstrings strings 0008 __Lstringtable stringtable 0008
__Lstruct struct 0020 __Ltemp temp 0070
__Ltext text 0190 __Lvectors vectors 000B
__S0 (abs) 0800 __S1 (abs) 0190
_exit init 0004 _main text0 07FD
_serial const1 0009 intlevel0 intentry 0004
_serial const1 0009 ; 這個變量是這樣聲明的“const int serial = 5621;”
_serial是變量名加前下劃線,const1是psect名稱
這里在“const”后面有一個數字,也即“const1”,這個數字可以是任何數字,也就是說,它不一定是1。你可以使用“%%u”來代替這個數字,對于大部分的后面帶有數字的psect都可以這樣,除了rbss_x和rdata_x。因為rbss_x和rdata_x是每個bank的RAM變量,rbss_0代表bank 0,rbss_1代表bank 1,依此類推……
“new_psect”是你要定制的psect的名稱,可以使任意名稱,但是不能和標準psect同名。
示例,聲明把“serial”放到一個新的psect里去是這樣做的:
#pragma psect const%%u=fixed_serial
const int serial = 5621;
每一個“#pragma psect”偽指令應該是在一個獨立的文件中被聲明,也就是說,所有的在“#pragma psect”下面聲明的變量都會被放到新的定制psect中去。
// --File serial.c
#pragma psect const%%u=fixed_serial
const int serial = 5621;
// --End file
// --File serial.h
extern int serial;
// --End file
具體放置這個新的定制psect,你將需要加入一些額外的命令行選項。
-L-Pcustom_psect=addressh
這里'-L'是傳遞選項給鏈接器,'-P'是定位一個psect到特定的地址,'custom_psect'是你想要定位的psect的名稱,'addressh'是你想要定位到的16進制地址。例如:
PICC -16f877 main.c serial.c -L-Pfixed_serial=50h
對于'text' psect有一些特殊問題。一個類似于'#pragma psect text%%u=myPsect'的偽指令會把所有的text psect放置到單個用戶定制的psect里。而優化器一直認為每個psect只包含一個函數。這將會產生bank切換的錯誤。
要避免這個問題,可以對用戶定制psect名稱也使用'%%u'后綴,例如:
#pragma psect text%%u=myPsect%%u
這樣多個用戶定制的psect將被產生。
例如:
//file test.c
#pragma psect text%%u=myPsect%%u
void func()
{
}
void func2()
{
}
void main()
{
}
//end file
你可以從列表文件和map文件中看到下面這些信息。
'func()' is in psect 'myPsect0'
'func1()' is in psect 'myPsect1'
'main()' is in psect 'myPsect2'
你于是就可以用'-L-P'選項給每一個psect清楚地分配地址。
所以,要把這些函數放到500h地址,你可以使用下面的編譯選項:
-L-PmyPsect0=500h,myPsect1,myPsect2
請注意-L-P 選項是沒有ROM頁邊界的檢查,你需要自己確保這個函數(psect)是不會超越頁邊界的,(譯者注:PICC要求每個函數都必須是在同一個ROM頁里的)。請查看使用說明書來得到更多關于'#pragma psect'的信息。
-
編碼器
+關注
關注
45文章
3669瀏覽量
135265 -
代碼
+關注
關注
30文章
4829瀏覽量
69067
發布評論請先 登錄
相關推薦
IAR小課堂 | 如何將一組函數或變量放在特定段內
有辦法把802.1as的協議報文隊列指定到某個特定的qos隊列中去嗎
全局變量和成員變量的區別分析
![全局<b class='flag-5'>變量</b>和成員<b class='flag-5'>變量</b>的區別分析](https://file1.elecfans.com//web2/M00/A7/11/wKgZomUMQimAGK-NAAAzhuzl1S4495.png)
【STM32CubeIDE】將變量定義到指定地址
![【STM32CubeIDE】將<b class='flag-5'>變量</b>定義到<b class='flag-5'>指定</b><b class='flag-5'>地址</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論