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

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

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

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

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

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

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

#pragma psect original_psect=new_psect

這里的“original_psect”是標(biāo)準(zhǔn)的code、constant或變量原來位于的psect名稱,這個(gè)orignal psect名稱可以從map文件的symbol table里找到。 一個(gè)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 ; 這個(gè)變量是這樣聲明的“const int serial = 5621;”

_serial是變量名加前下劃線,const1是psect名稱

這里在“const”后面有一個(gè)數(shù)字,也即“const1”,這個(gè)數(shù)字可以是任何數(shù)字,也就是說,它不一定是1。你可以使用“%%u”來代替這個(gè)數(shù)字,對(duì)于大部分的后面帶有數(shù)字的psect都可以這樣,除了rbss_x和rdata_x。因?yàn)閞bss_x和rdata_x是每個(gè)bank的RAM變量,rbss_0代表bank 0,rbss_1代表bank 1,依此類推……

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

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

#pragma psect const%%u=fixed_serial

const int serial = 5621;

每一個(gè)“#pragma psect”偽指令應(yīng)該是在一個(gè)獨(dú)立的文件中被聲明,也就是說,所有的在“#pragma psect”下面聲明的變量都會(huì)被放到新的定制psect中去。

// --File serial.c

#pragma psect const%%u=fixed_serial

const int serial = 5621;

// --End file

// --File serial.h

extern int serial;

// --End file

具體放置這個(gè)新的定制psect,你將需要加入一些額外的命令行選項(xiàng)。

-L-Pcustom_psect=addressh

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

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

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

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

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

這樣多個(gè)用戶定制的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)給每一個(gè)psect清楚地分配地址。

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

-L-PmyPsect0=500h,myPsect1,myPsect2

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

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

    關(guān)注

    45

    文章

    3647

    瀏覽量

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

    關(guān)注

    30

    文章

    4796

    瀏覽量

    68706
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    softune如何個(gè)變量定義在指定RAM地址

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

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

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

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

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

    如何在特定地址放置變量?

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

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

    按照手冊(cè)執(zhí)行qbv的測(cè)試時(shí),發(fā)現(xiàn)802.1as的協(xié)議報(bào)文也會(huì)被qbv的門控限制住,那么請(qǐng)問是否有辦法802.1as的協(xié)議報(bào)文隊(duì)列指定某個(gè)特定的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í)行速度。所以在這些場(chǎng)合我們會(huì)去思考如何指定段數(shù)組或者個(gè)函數(shù)到
    發(fā)表于 09-15 17:35 ?7次下載
    IAR中如何定向<b class='flag-5'>把</b>數(shù)組和函數(shù)放在<b class='flag-5'>指定</b>的<b class='flag-5'>地址</b>單元

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

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

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

    如何將變量存儲(chǔ)在指定內(nèi)存地址(基于Keil MDK-ARM)
    的頭像 發(fā)表于 02-29 16:32 ?1.6w次閱讀
    如何將<b class='flag-5'>變量</b>存儲(chǔ)在<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編寫程序的時(shí)候我們可以很輕松的將變量定義到指定地址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>

    映射位到某個(gè)RAM變量方法

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

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

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

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

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