亚洲国产日韩欧美在线a乱码,国产精品路线1路线2路线,亚洲视频一区,精品国产自,www狠狠,国产情侣激情在线视频免费看,亚洲成年网站在线观看

嵌入式C語言內(nèi)存操作編程重點(diǎn)知識點(diǎn)

時間:2020-09-12 10:05:27 嵌入式培訓(xùn) 我要投稿

嵌入式C語言內(nèi)存操作編程重點(diǎn)知識點(diǎn)

  本文主要講述了嵌入式系統(tǒng)C 編程中內(nèi)存操作的相關(guān)技巧.掌握并深入理解關(guān)于數(shù)據(jù)指針、函數(shù)指針、動態(tài)申請內(nèi)存、const 及volatile 關(guān)鍵字等的相關(guān)知識,是一個優(yōu)秀的C 語言程序設(shè)計師的基本要求.當(dāng)我們已經(jīng)牢固掌握了上述技巧后,我們就已經(jīng)學(xué)會了C 語言的99%,因?yàn)镃 語言最精華的內(nèi)涵皆在內(nèi)存操作中體現(xiàn).我們之所以在嵌入式系統(tǒng)中使用C 語言進(jìn)行程序設(shè)計,99%是因?yàn)槠鋸?qiáng)大的內(nèi)存操作能力!

嵌入式C語言內(nèi)存操作編程重點(diǎn)知識點(diǎn)

  數(shù)據(jù)指針

  在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對應(yīng)的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對地址的能力.在嵌入式系統(tǒng)的實(shí)際調(diào)試中,多借助C 語言指針?biāo)哂械膶^對地址單元內(nèi)容的讀寫能力.以指針直接操作內(nèi)存多發(fā)生在如下幾種情況:

  (1) 某I/O 芯片被定位在CPU 的存儲空間而非I/O 空間,而且寄存器對應(yīng)于某特定地址;

  (2) 兩個CPU 之間以雙端口RAM 通信,CPU 需要在雙端口RAM 的特定單元(稱為mail box)書寫內(nèi)容以在對方CPU 產(chǎn)生中斷;

  (3) 讀取在ROM 或FLASH 的特定單元所燒錄的漢字和英文字模.記住:CPU 以字節(jié)為單位編址,而C 語言指針以指向的數(shù)據(jù)類型長度作自增和自減.理解這一點(diǎn)對于以指針直接操作內(nèi)存是相當(dāng)重要的.

  函數(shù)指針

  首先要理解以下三個問題:

  (1)C 語言中函數(shù)名直接對應(yīng)于函數(shù)生成的指令代碼在內(nèi)存中的地址,因此函數(shù)名可以直接賦給指向函數(shù)的指針;

  (2)調(diào)用函數(shù)實(shí)際上等同于"調(diào)轉(zhuǎn)指令+參數(shù)傳遞處理+回歸位置入棧",本質(zhì)上最核心的操作是將函數(shù)生成的目標(biāo)代碼的首地址賦給CPU 的PC 寄存器;

  (3)因?yàn)楹瘮?shù)調(diào)用的本質(zhì)是跳轉(zhuǎn)到某一個地址單元的code 去執(zhí)行,所以可以"調(diào)用"一個根本就不存在的函數(shù)實(shí)體

  數(shù)組vs.動態(tài)申請

  在嵌入式系統(tǒng)中動態(tài)內(nèi)存申請存在比一般系統(tǒng)編程時更嚴(yán)格的要求,這是因?yàn)榍度胧较到y(tǒng)的內(nèi)存空間往往是十分有限的,不經(jīng)意的內(nèi)存泄露會很快導(dǎo)致系統(tǒng)的崩潰.所以一定要保證你的malloc 和free 成對出現(xiàn)給出原則:

  (1)盡可能的選用數(shù)組,數(shù)組不能越界訪問(真理越過一步就是謬誤,數(shù)組越過界限就光榮地成全了一個混亂的嵌入式系統(tǒng));

  (2)如果使用動態(tài)申請,則申請后一定要判斷是否申請成功了,并且malloc 和free應(yīng)成對出現(xiàn)!

  關(guān)鍵字const

  const 意味著"只讀".區(qū)別如下代碼的功能非常重要,也是老生長嘆,如果你還不知道它們的區(qū)別,而且已經(jīng)在程序界摸爬滾打多年,那只能說這是一個悲哀:

  const int a;

  int const a;

  const int *a;

  int * const a;

  int const * a const;

  (1)關(guān)鍵字const 的作用是為給讀你代碼的人傳達(dá)非常有用的信息.例如,在函數(shù)的形參前添加const 關(guān)鍵字意味著這個參數(shù)在函數(shù)體內(nèi)不會被修改,屬于"輸入?yún)?shù)".在有多個形參的時候,函數(shù)的調(diào)用者可以憑借參數(shù)前是否有const 關(guān)鍵字,清晰的辨別哪些是輸入?yún)?shù),哪些是可能的`輸出參數(shù).

  (2)合理地使用關(guān)鍵字const 可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無意的代碼修改,這樣可以減少bug 的出現(xiàn).

  關(guān)鍵字volatile

  C 語言編譯器會對用戶書寫的代碼進(jìn)行優(yōu)化,譬如如下代碼:

  int a,b,c;

  a = inWord(0x100); /*讀取I/O 空間0x100 端口的內(nèi)容存入a 變量*/

  b = a;

  a = inWord (0x100); /*再次讀取I/O 空間0x100 端口的內(nèi)容存入a 變量*/

  c = a;

  很可能被編譯器優(yōu)化為:

  int a,b,c;

  a = inWord(0x100); /*讀取I/O 空間0x100 端口的內(nèi)容存入a 變量*/

  b = a;

  c = a;

  但是這樣的優(yōu)化結(jié)果可能導(dǎo)致錯誤,如果I/O 空間0x100 端口的內(nèi)容在執(zhí)行第一次讀操作后被其它程序?qū)懭胄轮?則其實(shí)第2 次讀操作讀出的內(nèi)容與第一次不同,b 和c的值應(yīng)該不同.在變量a 的定義前加上volatile 關(guān)鍵字可以防止編譯器的類似優(yōu)化,正確的做法是:

  volatile int a;

  volatile 變量可能用于如下幾種情況:

  (1) 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器,例中的代碼屬于此類);

  (2) 一個中斷服務(wù)子程序中會訪問到的非自動變量(也就是全局變量);

  (3) 多線程應(yīng)用中被幾個任務(wù)共享的變量.

【嵌入式C語言內(nèi)存操作編程重點(diǎn)知識點(diǎn)】相關(guān)文章:

嵌入式開發(fā)—C語言面試題06-12

嵌入式C語言筆試題及答案06-21

2016年嵌入式c語言筆試題11-12

2016年嵌入式面試C語言試題「精選」09-24

嵌入式C語言面試題(附答案)09-24

嵌入式C語言中結(jié)構(gòu)體詳解201609-15

2016年嵌入式軟件C語言筆試題11-07

2016年嵌入式開發(fā)C語言問題詳解11-02

嵌入式系統(tǒng)內(nèi)存管理10-06