當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀] 編譯指示(Pragma Directives)可能是所有的預(yù)處理指令中最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。#pragma指令對編譯器給出了如何處理特定的函數(shù)、對象和代碼段的方法,在保持與C

 編譯指示(Pragma Directives)可能是所有的預(yù)處理指令中最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。#pragma指令對編譯器給出了如何處理特定的函數(shù)、對象和代碼段的方法,在保持與C/C++語言完全兼容的情況下,給出主機(比如C28x)或操作系統(tǒng)(比如DSP/BIOS)專有的特征。這些編譯指示的使用較為復(fù)雜,但是我們還必須要了解它們,因為它們是程序中必不可少的東西,例如#pragma DATA_SECTION ( symbol , " section name ");這樣的。但是往往講解它們的資料又不多(因為大部分資料集中在入門指南上面),所以在此我們就總結(jié)一下針對C28x編譯器的pragma指令,再遇到它們的時候就不會一頭霧水了。

1. CHECK_MISRA

它的作用與在編譯器選項中使用--check_misra是相同的,都是對特定源文件使能MISRA-C:2004規(guī)則檢查(汽車工業(yè)軟件可靠性聯(lián)會),使用方法是:

#pragma CHECK_MISRA (" {all|required|advisory|none|rulespec} ");

其中的rulespec是具體MISRA中的規(guī)則,使用方法請參考DSP編程技巧之12-揭開編譯器神秘面紗之代碼規(guī)范MISRA-C。

2. CLINK

CLINK指令可用于某段代碼或者某個數(shù)據(jù)符號,使用之后會在包含被作用符號的段中產(chǎn)生一個.clink指示,表明在條件鏈接的情況下,如果這個段沒有被其它任何段引用的話,這個段可以被移除,從而減小鏈接輸出文件的尺寸。使用方法是:

#pragma CLINK (symbol )

3. CODE_ALIGN

CODE_ALIGN用來沿著特定的對齊參數(shù)constant來對齊函數(shù)(從而可以讓CPU更快尋址,更快執(zhí)行指令)。當(dāng)我們希望函數(shù)從特定的邊界開始的時候,這個指令非常有用。參數(shù)constant必須是2的冪(偶數(shù)對齊),使用方法是:

C代碼: #pragma CODE_ALIGN ( func, constant );

C++代碼: #pragma CODE_ALIGN ( constant );

注:在本文中,在C和C++代碼中,指令使用方法一樣時,不分別寫出,如不一樣則分C代碼和C++代碼分別寫出。C代碼中的#pragma指令一般需指定函數(shù)名,也即其作用域;C++代碼中的#pragma指令一般不帶有函數(shù)名,其作用域為緊鄰該指令后面的函數(shù);下同。

4. CODE_SECTION

CODE_SECTION是較為常見的指令,默認情況下,代碼被存放在.text段中,使用此指令則用來指定并改變某段代碼所分配的段,其使用方法是:

C代碼: #pragma CODE_SECTION (symbol , "section name ")

C++代碼: #pragma CODE_SECTION (" section name ")

例如:

char bufferA[80];

char bufferB[80];

#pragma CODE_SECTION(funcA, "codeA")

char funcA(int i);

char funcB(int i);

void main()

{

char c;

c = funcA(1);

c = funcB(2);

}

char funcA (int i)

{

return bufferA[i];

}

char funcB (int j)

{

return bufferB[j];

}

5. DATA_SECTION

DATA_SECTION可能是使用最多的pragma指令了,它用來定義存儲某個符號所使用的段,使用方法是:

C代碼: #pragma DATA_SECTION ( symbol , " section name ");

C++代碼: #pragma DATA_SECTION (" section name ");

例如:

#pragma DATA_SECTION(bufferB, "my_sect")

char bufferA[512];

char bufferB[512];

6. 與診斷信息有關(guān)的Pragma

診斷信息一般包括:提醒,警告,錯誤和不提示等幾個級別,使用與診斷信息有關(guān)的Pragma和使用相關(guān)的編譯器選項的結(jié)果是一樣的,其使用方法以及們的對應(yīng)關(guān)系如下:

Pragma對應(yīng)的編譯器選項

有關(guān)診斷信息的含義,請參考DSP編程技巧之7---揭開編譯器神秘面紗之預(yù)處理與診斷。

7. FAST_FUNC_CALL

使用這個指令,會在編譯時調(diào)用快速匯編指令FFC,而不是傳統(tǒng)的CALL指令來完成函數(shù)的跳轉(zhuǎn),其使用方法是:

#pragma FAST_FUNC_CALL ( func );

它的使用范圍是受限的:僅限于調(diào)用返回LB *XAR7指令的匯編程序。例如:

;匯編程序

_add_long:

ADD ACC, *-SP[2]

LB *XAR7

//調(diào)用匯編的C程序

#pragma FAST_FUNC_CALL (add_long);

long add_long(long, long);

void foo()

{

long x, y;

x = 0xffff;

y = 0xff;

y = add_long(x, y);

}

除此之外,如果使用該指令,編譯器會輸出警告信息,并忽略其指示。

8. FUNC_EXT_CALLED

在我們啟用程序級別的優(yōu)化選項時(-O3),所有未直接或者簡介被main函數(shù)調(diào)用的函數(shù)都將被優(yōu)化掉,但是這些函數(shù)也有可能被我們定義的某些匯編代碼使用到,所以使用FUNC_EXT_CALLED可以在編譯時保留這些代碼,其使用方法是:

C代碼: #pragma FUNC_EXT_CALLED ( func );

C++代碼: #pragma FUNC_EXT_CALLED;

9. FUNCTION_OPTIONS

使用這個選項可以在編譯C/C++代碼中的某些函數(shù)時,使用額外的編譯器的命令行選項,實現(xiàn)與在命令行中輸入相關(guān)的命令同樣的效果。其使用方法是:

C代碼: #pragma FUNCTION_OPTIONS ( func, "additional options" );

C++代碼: #pragma FUNCTION_OPTIONS( "additional options" );

10. INTERRUPT

使用這個選項可以在C代碼中直接操作中斷,其使用方法是:

C代碼: #pragma INTERRUPT ( func );

C++代碼: #pragma INTERRUPT ;

被該指令直接操作的函數(shù)將使用IRP(中斷返回指針)來返回值。

在使用FPU時,中斷分為兩種:高優(yōu)先級中斷HPI和低優(yōu)先級中斷LPI,其中HPI使用快速的上下文存儲機制,不能被嵌套,LPI則與普通的C28x中斷機制一樣,并且可以被嵌套。此時可以增加第二個參數(shù)來控制:

C代碼: #pragma INTERRUPT ( func , {HPI|LPI} );

C++代碼: #pragma INTERRUPT ( {HPI|LPI} );

在DSP/BIOS和SYS/BIOS HWI對象中,不能使用INTERRUPT指令,因為Hwi_enter/Hwi_exit宏和Hwi解包器已經(jīng)包含了該函數(shù),此時使用該指令會產(chǎn)生負面的效果。

11. MUST_ITERATE

使用這個指令的情況下,我們確信某個for循環(huán)能夠執(zhí)行指定的次數(shù)。使用這個指令能夠幫助編譯器確定循環(huán)的次數(shù)和最佳的實現(xiàn)方式,從而減小代碼的尺寸。其使用方法是:

#pragma MUST_ITERATE ( min, max, multiple );

min是循環(huán)的最小次數(shù),max是最大執(zhí)行次數(shù),multiple則是循環(huán)次數(shù)的整數(shù)倍,如果這其中某個參數(shù)不存在,則可以省略,例如:

#pragma MUST_ITERATE(5); /* 最少循環(huán)5次 */

#pragma MUST_ITERATE(5, , 5); /* max參數(shù)省略;循環(huán)次數(shù)是5的倍數(shù)次(至少1倍) */

pragma MUST_ITERATE(8, 48, 8);

/* 循環(huán)此時可能為8, 16, 24, 32, 40, 48 */

12. NO_HOOKS

該指令阻止在調(diào)用函數(shù)時自動產(chǎn)生進入鉤子和退出鉤子,使用方法是:

C代碼: #pragma NO_HOOKS ( func );

C++代碼: #pragma NO_HOOKS;

13. RESET_MISRA

顧名思義,這個指令會把MISRA-C:2004規(guī)則檢查恢復(fù)到它原先的設(shè)定狀態(tài)。例如,某條規(guī)則在命令行里被使能,但是在某段代碼中被屏蔽了(某些原因?qū)е滤鼰o法通過規(guī)則檢查),使用該指令會規(guī)則檢查重新使能。使用方法是:

#pragma RESET_MISRA (" {all|required|advisory|rulespec} ")

14. RETAIN

使用這個指令,可以避免某些符號在條件鏈接時被優(yōu)化掉,從而在輸出文件中保留它。使用方法是:

#pragma RETAIN ( symbol )

這個指令與我們的第二條,CLINK的效果是整好相反的。

15. SET_CODE_SECTION與SET_DATA_SECTION

這兩條指令用來設(shè)置其后所有聲明的段。使用方法是:

C代碼: #pragma SET_CODE_SECTION ("section name")

C++代碼: #pragma SET_DATA_SECTION ("section name")

例如:

#pragma SET_DATA_SECTION("mydata")

int x;

int y;

#pragma SET_DATA_SECTION()

其中的x和y都被會放入我們指定的段mydata中,直到我們使用空參數(shù)SET_DATA_SECTION(),之后的代碼或數(shù)據(jù)才會被放入默認的段之中。

16. UNROLL

UNROLL是“攤開”的意思,這個指令與for/while相關(guān),意思是把n次的循環(huán)給展開,從而有個n份同樣的代碼。循環(huán)展開,是一種犧牲程序的尺寸來加快程序的執(zhí)行速度的優(yōu)化方法??梢允謩泳幊掏瓿?,也可由編譯器自動優(yōu)化完成。循環(huán)展開通過將循環(huán)體代碼復(fù)制多次實現(xiàn)。循環(huán)展開能夠增大指令調(diào)度的空間,減少循環(huán)分支指令的開銷。循環(huán)展開可以更好地實現(xiàn)數(shù)據(jù)預(yù)取技術(shù)。其使用方法是:

#pragma UNROLL( n );

只有在編譯器認為n是安全的(即展開之后確實都能執(zhí)行),才能執(zhí)行此操作。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉