0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

把指定代碼、常數(shù)或變量到某個特定地址的一個方法

麥辣雞腿堡 ? 來源:Microchip微芯 ? 作者:Microchip微芯 ? 2023-01-22 14:52 ? 次閱讀

問:如何指定代碼、常數(shù)或變量到某個特定的地址?

答:使用“#pragma psect”偽指令來把代碼、常數(shù)或變量放到你定制的psect。于是你就可以使用鏈接器選項(xiàng)來把這個定制的psect放到你想要的地址。Pragma psect的語法是:

#pragma psect original_psect=new_psect

這里的“original_psect”是標(biāo)準(zhǔn)的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”后面有一個數(shù)字,也即“const1”,這個數(shù)字可以是任何數(shù)字,也就是說,它不一定是1。你可以使用“%%u”來代替這個數(shù)字,對于大部分的后面帶有數(shù)字的psect都可以這樣,除了rbss_x和rdata_x。因?yàn)閞bss_x和rdata_x是每個bank的RAM變量,rbss_0代表bank 0,rbss_1代表bank 1,依此類推……

“new_psect”是你要定制的psect的名稱,可以使任意名稱,但是不能和標(biāo)準(zhǔn)psect同名。

示例,聲明把“serial”放到一個新的psect里去是這樣做的:

#pragma psect const%%u=fixed_serial

const int serial = 5621;

每一個“#pragma psect”偽指令應(yīng)該是在一個獨(dú)立的文件中被聲明,也就是說,所有的在“#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,你將需要加入一些額外的命令行選項(xiàng)。

-L-Pcustom_psect=addressh

這里'-L'是傳遞選項(xiàng)給鏈接器,'-P'是定位一個psect到特定的地址,'custom_psect'是你想要定位的psect的名稱,'addressh'是你想要定位到的16進(jìn)制地址。例如:

PICC -16f877 main.c serial.c -L-Pfixed_serial=50h

對于'text' psect有一些特殊問題。一個類似于'#pragma psect text%%u=myPsect'的偽指令會把所有的text psect放置到單個用戶定制的psect里。而優(yōu)化器一直認(rèn)為每個psect只包含一個函數(shù)。這將會產(chǎn)生bank切換的錯誤。

要避免這個問題,可以對用戶定制psect名稱也使用'%%u'后綴,例如:

#pragma psect text%%u=myPsect%%u

這樣多個用戶定制的psect將被產(chǎn)生。

例如:

//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'選項(xiàng)給每一個psect清楚地分配地址。

所以,要把這些函數(shù)放到500h地址,你可以使用下面的編譯選項(xiàng):

-L-PmyPsect0=500h,myPsect1,myPsect2

請注意-L-P 選項(xiàng)是沒有ROM頁邊界的檢查,你需要自己確保這個函數(shù)(psect)是不會超越頁邊界的,(譯者注:PICC要求每個函數(shù)都必須是在同一個ROM頁里的)。請查看使用說明書來得到更多關(guān)于'#pragma psect'的信息。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    44

    文章

    3529

    瀏覽量

    133296
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67765
收藏 人收藏

    評論

    相關(guān)推薦

    softune如何變量定義在指定RAM地址?

    你好,請問如何變量定義在指定RAM地址? 例如
    發(fā)表于 01-18 10:48

    TC275如何將指定變量放在指定地址中?

    如何在代碼中以及Lcf_Gnuc.lsl如何修改,能夠?qū)?b class='flag-5'>某個變量放在指定地址中,能否給示例
    發(fā)表于 02-06 08:08

    IAR小課堂 | 如何將組函數(shù)變量放在特定段內(nèi)

    本文描述了在不使用多個#pragma location指令的情況下,在指定的段中放置多個函數(shù)變量的兩種方法。討論可以使用#pragma location將
    發(fā)表于 12-11 10:02

    如何在特定地址放置變量

    如何在特定地址放置變量? - spartan3e - microblaze - SDK 14.2
    發(fā)表于 04-06 15:02

    有辦法802.1as的協(xié)議報文隊(duì)列指定某個特定的qos隊(duì)列中去嗎

    按照手冊執(zhí)行qbv的測試時,發(fā)現(xiàn)802.1as的協(xié)議報文也會被qbv的門控限制住,那么請問是否有辦法802.1as的協(xié)議報文隊(duì)列指定某個特定的qos隊(duì)列中,避免被誤傷?
    發(fā)表于 12-31 07:28

    MuonRiber studio中怎么變量定義在指定地址?

    MuonRiber studio中我怎么變量定義在指定地址,或是怎么變量定義在
    發(fā)表于 09-14 06:36

    如何在Keil中將函數(shù)變量編譯到指定地址

    如何在Keil中將函數(shù)變量編譯到指定地址在Keil 中將函數(shù)變量編譯到
    發(fā)表于 10-19 06:51

    IAR中如何定向數(shù)組和函數(shù)放在指定地址單元

    定義函數(shù)到RAM區(qū)域,增快程序代碼的執(zhí)行速度。所以在這些場合我們會去思考如何指定段數(shù)組或者函數(shù)到
    發(fā)表于 09-15 17:35 ?6次下載
    IAR中如何定向<b class='flag-5'>把</b>數(shù)組和函數(shù)放在<b class='flag-5'>指定</b>的<b class='flag-5'>地址</b>單元

    全局變量和成員變量的區(qū)別分析

    成員變量指定維度的成員變量,用于標(biāo)識某個維度成員。簡介由 Analysis Services 內(nèi)部使用的值,以標(biāo)識某個維度成員。Membe
    發(fā)表于 12-11 13:50 ?6847次閱讀
    全局<b class='flag-5'>變量</b>和成員<b class='flag-5'>變量</b>的區(qū)別分析

    如何將變量存儲在指定內(nèi)存地址 (基于Keil MDK-ARM)

    如何將變量存儲在指定內(nèi)存地址(基于Keil MDK-ARM)
    的頭像 發(fā)表于 02-29 16:32 ?1.4w次閱讀
    如何將<b class='flag-5'>變量</b>存儲在<b class='flag-5'>指定</b>內(nèi)存<b class='flag-5'>地址</b> (基于Keil MDK-ARM)

    Keil中指定代碼段與常量在Flash中地址方法

    圖 分配代碼文件到Flash指定位置方法 在.sct文件中指定代碼輸出文件(.o格式)到Flash
    發(fā)表于 11-20 14:36 ?20次下載
    Keil中<b class='flag-5'>指定</b><b class='flag-5'>代碼</b>段與常量在Flash中<b class='flag-5'>地址</b><b class='flag-5'>方法</b>

    【STM32CubeIDE】將變量定義到指定地址

    使用Keil在使用Keil編寫程序的時候我們可以很輕松的將變量定義到指定地址uint8_t array[1024] __attribute__((at(0x20010000
    發(fā)表于 12-27 19:08 ?28次下載
    【STM32CubeIDE】將<b class='flag-5'>變量</b>定義到<b class='flag-5'>指定</b><b class='flag-5'>地址</b>

    映射位到某個RAM變量方法

    問:我想訪問某個字節(jié)中的單個位,但是當(dāng)我嘗試用絕對變量結(jié)構(gòu)定義變量時,例如: static bit bitvar @ ((unsign
    的頭像 發(fā)表于 01-22 15:11 ?536次閱讀

    基于IAR指定RL78程序地址空間說明

    基于IAR實(shí)現(xiàn)C文件指定地址存放&函數(shù)指定地址存放,定義變量指定
    的頭像 發(fā)表于 06-19 15:24 ?2363次閱讀
    基于IAR<b class='flag-5'>指定</b>RL78程序<b class='flag-5'>地址</b>空間說明

    js中如何判斷數(shù)組中包含某個特定的值

    在JavaScript中,我們可以通過多種方法來判斷數(shù)組中是否包含某個特定的值。以下是些常
    的頭像 發(fā)表于 11-30 16:21 ?1177次閱讀