一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

嵌入式C語(yǔ)言?xún)却娌僮骶幊讨攸c(diǎn)知識點(diǎn)

時(shí)間:2024-11-05 01:20:00 嵌入式培訓 我要投稿
  • 相關(guān)推薦

嵌入式C語(yǔ)言?xún)却娌僮骶幊讨攸c(diǎn)知識點(diǎn)

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

嵌入式C語(yǔ)言?xún)却娌僮骶幊讨攸c(diǎn)知識點(diǎn)

  數據指針

  在嵌入式系統的編程中,常常要求在特定的內存單元讀寫(xiě)內容,匯編有對應的MOV指令,而除C/C++以外的其它編程語(yǔ)言基本沒(méi)有直接訪(fǎng)問(wèn)絕對地址的能力.在嵌入式系統的實(shí)際調試中,多借助C 語(yǔ)言指針所具有的對絕對地址單元內容的讀寫(xiě)能力.以指針直接操作內存多發(fā)生在如下幾種情況:

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

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

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

  函數指針

  首先要理解以下三個(gè)問(wèn)題:

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

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

  (3)因為函數調用的本質(zhì)是跳轉到某一個(gè)地址單元的code 去執行,所以可以"調用"一個(gè)根本就不存在的函數實(shí)體

  數組vs.動(dòng)態(tài)申請

  在嵌入式系統中動(dòng)態(tài)內存申請存在比一般系統編程時(shí)更嚴格的要求,這是因為嵌入式系統的內存空間往往是十分有限的,不經(jīng)意的內存泄露會(huì )很快導致系統的崩潰.所以一定要保證你的malloc 和free 成對出現給出原則:

  (1)盡可能的選用數組,數組不能越界訪(fǎng)問(wèn)(真理越過(guò)一步就是謬誤,數組越過(guò)界限就光榮地成全了一個(gè)混亂的嵌入式系統);

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

  關(guān)鍵字const

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

  const int a;

  int const a;

  const int *a;

  int * const a;

  int const * a const;

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

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

  關(guān)鍵字volatile

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

  int a,b,c;

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

  b = a;

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

  c = a;

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

  int a,b,c;

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

  b = a;

  c = a;

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

  volatile int a;

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

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

  (2) 一個(gè)中斷服務(wù)子程序中會(huì )訪(fǎng)問(wèn)到的非自動(dòng)變量(也就是全局變量);

  (3) 多線(xiàn)程應用中被幾個(gè)任務(wù)共享的變量.

【嵌入式C語(yǔ)言?xún)却娌僮骶幊讨攸c(diǎn)知識點(diǎn)】相關(guān)文章:

2016年嵌入式c語(yǔ)言筆試題08-16

2016年嵌入式面試C語(yǔ)言試題「精選」09-25

2016年嵌入式軟件C語(yǔ)言筆試題10-02

2016年嵌入式開(kāi)發(fā)C語(yǔ)言問(wèn)題詳解07-20

嵌入式C語(yǔ)言面試題(附答案)06-15

數控車(chē)床編程與操作08-21

嵌入式C/C++面試題201610-10

嵌入式開(kāi)發(fā)中C語(yǔ)言中結構體解讀201608-12

嵌入式操作系統的功能02-23

數控機床編程與操作試卷10-20

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看