日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

 編譯指示(Pragma Directives)可能是所有的預(yù)處理指令中最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動(dòng)作。#pragma指令對(duì)編譯器給出了如何處理特定的函數(shù)、對(duì)象和代碼段的方法,在保持與C/C++語(yǔ)言完全兼容的情況下,給出主機(jī)(比如C28x)或操作系統(tǒng)(比如DSP/BIOS)專(zhuān)有的特征。這些編譯指示的使用較為復(fù)雜,但是我們還必須要了解它們,因?yàn)樗鼈兪浅绦蛑斜夭豢缮俚臇|西,例如#pragma DATA_SECTION ( symbol , " section name ");這樣的。但是往往講解它們的資料又不多(因?yàn)榇蟛糠仲Y料集中在入門(mén)指南上面),所以在此我們就總結(jié)一下針對(duì)C28x編譯器的pragma指令,再遇到它們的時(shí)候就不會(huì)一頭霧水了。

1. CHECK_MISRA

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

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

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

2. CLINK

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

#pragma CLINK (symbol )

3. CODE_ALIGN

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

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

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

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

4. CODE_SECTION

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

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指令了,它用來(lái)定義存儲(chǔ)某個(gè)符號(hào)所使用的段,使用方法是:

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

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

Pragma對(duì)應(yīng)的編譯器選項(xiàng)

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

7. FAST_FUNC_CALL

使用這個(gè)指令,會(huì)在編譯時(shí)調(diào)用快速匯編指令FFC,而不是傳統(tǒng)的CALL指令來(lái)完成函數(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);

}

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

8. FUNC_EXT_CALLED

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

C代碼: #pragma FUNC_EXT_CALLED ( func );

C++代碼: #pragma FUNC_EXT_CALLED;

9. FUNCTION_OPTIONS

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

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

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

10. INTERRUPT

使用這個(gè)選項(xiàng)可以在C代碼中直接操作中斷,其使用方法是:

C代碼: #pragma INTERRUPT ( func );

C++代碼: #pragma INTERRUPT ;

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

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

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

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

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

11. MUST_ITERATE

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

#pragma MUST_ITERATE ( min, max, multiple );

min是循環(huán)的最小次數(shù),max是最大執(zhí)行次數(shù),multiple則是循環(huán)次數(shù)的整數(shù)倍,如果這其中某個(gè)參數(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)此時(shí)可能為8, 16, 24, 32, 40, 48 */

12. NO_HOOKS

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

C代碼: #pragma NO_HOOKS ( func );

C++代碼: #pragma NO_HOOKS;

13. RESET_MISRA

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

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

14. RETAIN

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

#pragma RETAIN ( symbol )

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

15. SET_CODE_SECTION與SET_DATA_SECTION

這兩條指令用來(lái)設(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都被會(huì)放入我們指定的段mydata中,直到我們使用空參數(shù)SET_DATA_SECTION(),之后的代碼或數(shù)據(jù)才會(huì)被放入默認(rèn)的段之中。

16. UNROLL

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

#pragma UNROLL( n );

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

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

北京2024年8月8日 /美通社/ -- 近日,軟通動(dòng)力T6司庫(kù)管理系統(tǒng)、票據(jù)管理系統(tǒng)IDMS、醫(yī)共體一體化管理平臺(tái)三款產(chǎn)品獲鯤鵬原生開(kāi)發(fā)認(rèn)證(Kunpeng NATIVE)。這是軟通動(dòng)力自年初正式啟動(dòng)鯤鵬原生開(kāi)發(fā)以來(lái),...

關(guān)鍵字: PEN 編譯 DEVKIT 操作系統(tǒng)

KeilμVision4是Keil軟件公司為8051系列微控制器及其兼容產(chǎn)品設(shè)計(jì)的集成式軟件開(kāi)發(fā)環(huán)境。μVision4集成了C51編譯器和A51匯編器,其界面類(lèi)似于Microsoft VS,支持C語(yǔ)言和匯編語(yǔ)言程序的編寫(xiě)...

關(guān)鍵字: 程序 編譯 鏈接

第五屆中國(guó)國(guó)際進(jìn)口博覽會(huì),丹納赫集團(tuán)攜手中國(guó)健康傳媒集團(tuán),在創(chuàng)新技術(shù)在疫苗、細(xì)胞治療藥物、中藥研發(fā)以及質(zhì)量控制中的應(yīng)用等領(lǐng)域簽署戰(zhàn)略合作。同時(shí),雙方將共同編譯并出版《生物制藥工藝》等書(shū)籍,以支持相關(guān)領(lǐng)域國(guó)際前沿技術(shù)工具在...

關(guān)鍵字: 編譯 質(zhì)量控制

(全球TMT2022年9月27日訊)新思科技近日宣布推出業(yè)內(nèi)首款基于其ZeBu? EP1硬件仿真系統(tǒng)的硬件仿真與原型驗(yàn)證統(tǒng)一硬件系統(tǒng),致力為SoC驗(yàn)證和前期軟件開(kāi)發(fā)提供更高水平的性能和靈活性。新思科技ZeBu...

關(guān)鍵字: 硬件仿真 新思科技 硬件系統(tǒng) 編譯

3個(gè)SystemVerilog新特性!01`begin_keyword`end_keyword硬件描述語(yǔ)言中有很多特殊的編譯或者綜合等工具的預(yù)執(zhí)行指令,在某些場(chǎng)景下我們可以利用一下HDL之外的語(yǔ)法去指導(dǎo)工具,而不是信馬由...

關(guān)鍵字: SYSTEMVERILOG DEFINE PACKAGE 編譯

你知道,為什么在C中使用了pow函數(shù)不需要鏈接libm庫(kù)嗎?什么情況需要指定鏈接庫(kù)?在解釋之前,先回顧一下。//來(lái)源:公眾號(hào)【編程珠璣】//https://www.yanbinghu.com#include#includ...

關(guān)鍵字: 編譯 POW IBM TEST

????關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容作者:hguisu一、地址概念和程序如何運(yùn)行在多道程序環(huán)境下,要使程序運(yùn)行,必須先為之創(chuàng)建進(jìn)程。而創(chuàng)建進(jìn)程的第一件事,便是將程序和數(shù)據(jù)裝入內(nèi)存。如何將一個(gè)用戶(hù)源程序變?yōu)橐粋€(gè)可在內(nèi)存中...

關(guān)鍵字: 編譯

作?者:道哥,10年嵌入式開(kāi)發(fā)老兵,專(zhuān)注于:C/C、嵌入式、Linux。關(guān)注下方公眾號(hào),回復(fù)【書(shū)籍】,獲取Linux、嵌入式領(lǐng)域經(jīng)典書(shū)籍;回復(fù)【PDF】,獲取所有原創(chuàng)文章(PDF格式)。目錄學(xué)習(xí)的困惑實(shí)踐環(huán)境編譯進(jìn)內(nèi)核編...

關(guān)鍵字: 內(nèi)核 編譯 驅(qū)動(dòng)程序

不知道各位小伙伴是否碰到過(guò)這樣的情況:一個(gè).c文件include另一個(gè).h頭文件,使用Makefile來(lái)構(gòu)建(編譯)應(yīng)用程序。第一次編譯、執(zhí)行,很正常!但是此時(shí),如果修改了.h頭文件,再次編譯時(shí),就出現(xiàn)問(wèn)題了:預(yù)期的執(zhí)行...

關(guān)鍵字: 編譯

一、前言老周這里編譯Kafka的版本是2.7,為啥采用這個(gè)版本來(lái)搭建源碼的閱讀環(huán)境呢?因?yàn)樵摪姹鞠鄬?duì)來(lái)說(shuō)比較新。而我為啥不用2.7后的版本呢?比如2.8,這是因?yàn)槿サ袅薢ooKeeper,還不太穩(wěn)定,生產(chǎn)環(huán)境也不太建議使...

關(guān)鍵字: 源碼 編譯
關(guān)閉