<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 嵌入式C語言內存操作編程重點知識點

    時間:2024-11-05 01:20:00 嵌入式培訓 我要投稿
    • 相關推薦

    嵌入式C語言內存操作編程重點知識點

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

    嵌入式C語言內存操作編程重點知識點

      數據指針

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

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

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

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

      函數指針

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

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

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

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

      數組vs.動態申請

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

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

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

      關鍵字const

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

      const int a;

      int const a;

      const int *a;

      int * const a;

      int const * a const;

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

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

      關鍵字volatile

      C 語言編譯器會對用戶書寫的代碼進行優化,譬如如下代碼:

      int a,b,c;

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

      b = a;

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

      c = a;

      很可能被編譯器優化為:

      int a,b,c;

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

      b = a;

      c = a;

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

      volatile int a;

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

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

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

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

    【嵌入式C語言內存操作編程重點知識點】相關文章:

    2016年嵌入式c語言筆試題08-16

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

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

    2016年嵌入式開發C語言問題詳解07-20

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

    數控車床編程與操作08-21

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

    嵌入式開發中C語言中結構體解讀201608-12

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

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

    主站蜘蛛池模板: 无码精品久久久天天影视| 孩交VIDEOS精品乱子| 日韩精品内射视频免费观看| 久久亚洲国产精品一区二区| 亚洲精品无码mv在线观看网站| 亚洲国产综合精品中文第一区| 亚洲精品国精品久久99热一| 刺激无码在线观看精品视频| 国产精品免费福利久久| 无码精品人妻一区二区三区免费| 亚洲精品欧美综合| 2021国产精品成人免费视频| 在线涩涩免费观看国产精品| 国产精品永久免费| 九九热这里只有在线精品视| 色欲精品国产一区二区三区AV| 国产精品美女久久久久AV福利| 看99视频日韩精品| 91精品国产91久久久久久蜜臀| 精品福利一区二区三区免费视频| 欧美精品在线视频| 国产成人综合精品一区| 国产精品福利一区二区| 久久99国产综合精品免费| 香蕉99久久国产综合精品宅男自 | 久久精品不卡| 99热日韩这里只有精品| 国产精品1024香蕉在线观看| 久久久精品国产sm调教网站 | 久久国产精品99久久久久久老狼 | 精品久久久久久久中文字幕| 亚洲国产成人久久精品影视| 91精品一区国产高清在线| 精品无码人妻夜人多侵犯18| 亚洲人成精品久久久久| 亚洲一区无码精品色| 亚洲福利精品一区二区三区| 欧美日韩国产精品系列| 欧美亚洲成人精品| 亚洲国产精品激情在线观看| 青娱乐国产精品视频|