![在嵌入式軟件編程中深入理解關(guān)鍵字-基礎(chǔ)電子_第1頁](http://file4.renrendoc.com/view/2c59682395a381caed4dc8ed75b99e50/2c59682395a381caed4dc8ed75b99e501.gif)
![在嵌入式軟件編程中深入理解關(guān)鍵字-基礎(chǔ)電子_第2頁](http://file4.renrendoc.com/view/2c59682395a381caed4dc8ed75b99e50/2c59682395a381caed4dc8ed75b99e502.gif)
![在嵌入式軟件編程中深入理解關(guān)鍵字-基礎(chǔ)電子_第3頁](http://file4.renrendoc.com/view/2c59682395a381caed4dc8ed75b99e50/2c59682395a381caed4dc8ed75b99e503.gif)
![在嵌入式軟件編程中深入理解關(guān)鍵字-基礎(chǔ)電子_第4頁](http://file4.renrendoc.com/view/2c59682395a381caed4dc8ed75b99e50/2c59682395a381caed4dc8ed75b99e504.gif)
![在嵌入式軟件編程中深入理解關(guān)鍵字-基礎(chǔ)電子_第5頁](http://file4.renrendoc.com/view/2c59682395a381caed4dc8ed75b99e50/2c59682395a381caed4dc8ed75b99e505.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
精品文檔-下載后可編輯在嵌入式軟件編程中深入理解關(guān)鍵字-基礎(chǔ)電子引言
計(jì)算機(jī)編程語言的關(guān)鍵字就好比是它的靈魂,只有深入理解了它們的含義才能編寫出的代碼。C語言以其簡(jiǎn)潔、高效和強(qiáng)大等特性成為嵌入式軟件編程的語言,但是某些關(guān)鍵字,例如const、static、extern和volatile等,在不同的場(chǎng)合具有不同的含義,而且某些用法晦澀難懂,為此本文詳細(xì)介紹這些關(guān)鍵字的用法及其背后的原理。
1const
const限定的對(duì)象表示編譯器可以將它放在只讀存儲(chǔ)器中,也就意味著在對(duì)其進(jìn)行初始化之后就不能改變它的值。根據(jù)const使用的不同場(chǎng)合,大致可以分為三種情況,其一限定普通變量,其二限定函數(shù)參數(shù),其三限定指針變量。
和第二種情況為簡(jiǎn)單,語句①和語句②分別展示了它的用法。語句①定義了一個(gè)值為10的整型常量。語句②中的const表示在函數(shù)體中不能修改src指向的區(qū)域中的數(shù)據(jù),這與函數(shù)的拷貝功能相對(duì)應(yīng),只做它應(yīng)該做的事情而不應(yīng)該有其他副作用,編譯器可以利用這些信息進(jìn)行適當(dāng)?shù)膬?yōu)化。
①constinti=10;
②void*memcpy(void*dst,constvoid*src,size_tsize);
③constint*ptr;
④intconst*ptr;
⑤int*constptr;
⑥intconst*consptr;
第3種情況為復(fù)雜,雖然只是const位置不同,但是卻可能具有完全不同的意義。一般,一個(gè)聲明語句由聲明說明符(decl-specifier)和一系列聲明子(declarator)兩部分組成,而且聲明說明符中的符號(hào)可以以任何次序出現(xiàn)。理解聲明的步是定位說明符和聲明子的邊界。這很容易:所有的說明符都是關(guān)鍵字或者類型名,因此說明符終止于個(gè)不是以上類型之一的符號(hào)。例如,在語句③和④中個(gè)既不是關(guān)鍵字也不是類型名的符號(hào)是“*”,即聲明說明符分別為const.int和intconst,由于聲明說明符中的符號(hào)可以以任意次序出現(xiàn),因此語句③和④的含義是相同的。
為了迅速弄清語句表達(dá)的含義,參考文獻(xiàn)[1]介紹了一種簡(jiǎn)便的方法,其要點(diǎn)就是“逆序讀出定義”,如圖1所示。
2static與extem
static的含義隨著出現(xiàn)位置(全局變量還是局部變量)和修飾對(duì)象(變量還是函數(shù))的不同而有很大的差別。下面各條目中的模塊指的是一個(gè)源文件或者一個(gè)翻譯單元:
①位于函數(shù)體中的靜態(tài)變量在多次函數(shù)調(diào)用間會(huì)維持其值。
②位于模塊內(nèi)(但在函數(shù)體外)的靜態(tài)變量可以被模塊內(nèi)的所有函數(shù)訪問,但不能被模塊外其他函數(shù)訪問。也就是說,它是一個(gè)本地的全局變量。
③位于模塊內(nèi)的靜態(tài)函數(shù)只能被此模塊內(nèi)的其他函數(shù)調(diào)用。也就是說,這個(gè)函數(shù)的作用域?yàn)槁暶魉诘哪K。
為了清楚地理解static的3種用法,必須首先了解C語言中每個(gè)標(biāo)識(shí)符都具有的作用域、鏈接和存儲(chǔ)持續(xù)期等特性的含義。在ISOC99標(biāo)準(zhǔn)中,其定義如下:
①對(duì)象的作用域指的是它僅在程序的某個(gè)區(qū)域中是可見的(即可以使用)。常見的作用域有文件作用域和塊作用域。
②對(duì)象的存儲(chǔ)持續(xù)期決定對(duì)象的生命周期,即在程序執(zhí)行某段區(qū)間中為對(duì)象保留存儲(chǔ)區(qū)。有兩種類型的存儲(chǔ)持續(xù)期:靜態(tài)的和自動(dòng)的。靜態(tài)存儲(chǔ)持續(xù)期的對(duì)象的生命周期為程序執(zhí)行的全過程,它的值在程序啟動(dòng)前僅初始化。
③鏈接指的是在不同作用域中聲明的或者同一個(gè)作用域中多次聲明的標(biāo)識(shí)符可以引用相同的對(duì)象或函數(shù)。有3種類型的鏈接:外部、內(nèi)部和無。在情況②和③中,static分別用來修飾全局變量glob-al和函數(shù)foo,改變它們的鏈接特性,使它們具有內(nèi)部鏈接。也就是說,只有在定義它們的翻譯單元或者文件內(nèi)才能使用它們,這對(duì)于創(chuàng)建模塊化的軟件非常重要。
與static相反,extern修飾的對(duì)象或函數(shù)具有外部鏈接。對(duì)于那些暴露給外部使用的接口函數(shù)應(yīng)該使用ex-tern限定,那些非接口函數(shù),例如工具函數(shù)或與實(shí)現(xiàn)細(xì)節(jié)相關(guān)的函數(shù),則應(yīng)該顯式地使用static限定。這是因?yàn)槿绻瘮?shù)聲明不帶任何存儲(chǔ)類說明符,那么它具有外部鏈接就好像使用了extern一樣。
在情況①中,static用來修飾局部變量local,將local的存儲(chǔ)持續(xù)期由自動(dòng)的改變?yōu)殪o態(tài)的,這樣在foo函數(shù)的多次調(diào)用間會(huì)為其保留值。注意作用域、鏈接和存儲(chǔ)持續(xù)期特性之間是正交的。例如在情況①中,雖然變量local的存儲(chǔ)持續(xù)期變成靜態(tài)的,但是它的作用域仍然是塊作用域。
3volatile
volatile關(guān)鍵字用來聲明這樣的對(duì)象,它們的值可能由于程序控制之外的事件而被潛在改變。volatile強(qiáng)制編譯器不會(huì)對(duì)其所限定的對(duì)象進(jìn)行任何優(yōu)化,每次讀寫都必須訪問實(shí)際的存儲(chǔ)器而不能使用寄存器中的副本。在實(shí)踐中,它大量的用來描述一個(gè)對(duì)應(yīng)于內(nèi)存映射的輸入/輸出端口,例如飛利浦公司LPC21xx系列ARM處理器的向量地址寄存器定義為:
#defineVICVectAddr(*((volatileunsignedlong*)0xFFFFF030))
其次,中斷服務(wù)例程中使用的非自動(dòng)變量或者多線程應(yīng)用程序中多個(gè)任務(wù)共享的變量也必須使用volatile進(jìn)行限定。例如在下面的示例中,如果沒有使用volatile限定g_Flag變量,編譯器看到在foo函數(shù)中并沒有修改g_Flag,可能只執(zhí)行g(shù)_Flag讀操作并將g_Flag的值緩存在寄存器中,以后每次g_Flag讀操作都使用寄存器中的緩存值而不進(jìn)行存儲(chǔ)器訪問,導(dǎo)致some_action函數(shù)永遠(yuǎn)無法執(zhí)行。
4Dacked
在嵌入式軟件編程中,經(jīng)常需要控制結(jié)構(gòu)體在內(nèi)存中的布局和訪問非自然對(duì)齊的數(shù)據(jù),但是C語言標(biāo)準(zhǔn)中并沒有統(tǒng)一的規(guī)定而是留給編譯器廠商自行處理。在ARMC編譯器中,使用__packed關(guān)鍵字將任何類型的對(duì)齊設(shè)置為1字節(jié)。在實(shí)踐中,__packed主要有兩個(gè)功能:其一,當(dāng)它修飾指針時(shí),表示此指針指向的地址是非自然對(duì)齊的,編譯器會(huì)生成特殊的代碼以確保獲得正確的結(jié)果;其二,當(dāng)它修飾結(jié)構(gòu)體、聯(lián)合或它們中的域時(shí),可以用來創(chuàng)建沒有填充的結(jié)構(gòu)。
與其他RISC架構(gòu)一樣,ARM處理器能夠高效地訪問對(duì)齊的數(shù)據(jù),即字地址的末尾兩位為零,半字地址的一位為零,也稱這樣的數(shù)據(jù)位于它的自然大小邊界或者是自然對(duì)齊的。ARM編譯器希望普通的“C”指針指向一個(gè)4字節(jié)對(duì)齊內(nèi)存地址,這樣它可以在代碼中使用LDR/STR指令操作4個(gè)字節(jié),否則只能使用LDRB/LDRH等字節(jié)/半字操作指令。相反如果指針指向一個(gè)非自然對(duì)齊的地址,例如如果一個(gè)整型指針指向地址0x8006,當(dāng)然希望裝載地址0xS006-0xS007-0x8008-0xS009處的數(shù)據(jù),但是實(shí)際上ARM會(huì)對(duì)非自然對(duì)齊的地址進(jìn)行轉(zhuǎn)換而從裝載地址0xS004-0xS005-0x8006-0xS007處的數(shù)據(jù)。在下面的示例中(測(cè)試環(huán)境為uVision3),首先定義了一個(gè)大小為16字節(jié)的整型數(shù)組,依次初始化為0,1,2,…,15。由于array是一個(gè)整型數(shù)組,編譯器會(huì)確保它是4字節(jié)對(duì)齊的,即指針pc指向一個(gè)4字節(jié)對(duì)齊的地址。運(yùn)行程序后,可以看到如果對(duì)pc指針不加__packed標(biāo)記進(jìn)行修飾,將得到一個(gè)奇怪的0x01000302;而在添加了__packed關(guān)鍵字之后,就得到了正確的結(jié)果。也就是說,如果要訪問非自然對(duì)齊的數(shù)據(jù),必須使用__packed關(guān)鍵字顯式地標(biāo)記出來。
ARM編譯器總是保證程序中的變量、結(jié)構(gòu)體或聯(lián)合中的域分配到自然對(duì)齊的地址。這意味著編譯器經(jīng)常需要在各個(gè)域之間插入填充,以確保每個(gè)域的自然對(duì)齊。通常來說,程序員可以對(duì)這些填充視而不見,但是也有例外,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度國際貿(mào)易法律援助合同-世界貿(mào)易組織規(guī)則下法律爭(zhēng)議援助協(xié)議
- 廣西桂林市2025屆高三下學(xué)期開學(xué)質(zhì)量檢測(cè)語文試卷(含答案)
- 貴州2025年貴州省糧食和物資儲(chǔ)備局所屬事業(yè)單位招聘3人筆試歷年參考題庫附帶答案詳解
- 鄭州2025年河南滎陽市機(jī)關(guān)事務(wù)中心招聘政務(wù)輔助工作人員筆試歷年參考題庫附帶答案詳解
- 貴州2025年共青團(tuán)貴州省委直屬事業(yè)單位招聘7人筆試歷年參考題庫附帶答案詳解
- 衢州2025年浙江衢州市醫(yī)學(xué)會(huì)招聘工作人員筆試歷年參考題庫附帶答案詳解
- 蘇州2025年江蘇蘇州高新區(qū)教育系統(tǒng)招聘事業(yè)編制教師210人筆試歷年參考題庫附帶答案詳解
- 白城2025年吉林白城市通榆縣事業(yè)單位面向上半年應(yīng)征入伍高校畢業(yè)生招聘5人筆試歷年參考題庫附帶答案詳解
- 湖南2025年湖南省交通運(yùn)輸廳所屬事業(yè)單位招聘32人筆試歷年參考題庫附帶答案詳解
- 湖南2024年湖南省林業(yè)局直屬事業(yè)單位招聘筆試歷年參考題庫附帶答案詳解
- 長(zhǎng)江委水文局2025年校園招聘17人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年湖南韶山干部學(xué)院公開招聘15人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 廣東省廣州市番禺區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末數(shù)學(xué)試題
- 不可切除肺癌放療聯(lián)合免疫治療專家共識(shí)(2024年版)j解讀
- DB23/T 3657-2023醫(yī)養(yǎng)結(jié)合機(jī)構(gòu)服務(wù)質(zhì)量評(píng)價(jià)規(guī)范
- 教科版科學(xué)六年級(jí)下冊(cè)14《設(shè)計(jì)塔臺(tái)模型》課件
- 智研咨詢發(fā)布:2024年中國MVR蒸汽機(jī)械行業(yè)市場(chǎng)全景調(diào)查及投資前景預(yù)測(cè)報(bào)告
- 法規(guī)解讀丨2024新版《突發(fā)事件應(yīng)對(duì)法》及其應(yīng)用案例
- JGJ46-2024 建筑與市政工程施工現(xiàn)場(chǎng)臨時(shí)用電安全技術(shù)標(biāo)準(zhǔn)
- 煙花爆竹重大危險(xiǎn)源辨識(shí)AQ 4131-2023知識(shí)培訓(xùn)
- 企業(yè)動(dòng)火作業(yè)安全管理制度范文
評(píng)論
0/150
提交評(píng)論