嵌入式C語言內存操作編程重點知識點
本文主要講述了嵌入式系統C 編程中內存操作的相關技巧.掌握並深入理解關於數據指針、函數指針、動態申請內存、const 及volatile 關鍵字等的相關知識,是一個優秀的C 語言程序設計師的基本要求.當我們已經牢固掌握了上述技巧後,我們就已經學會了C 語言的99%,因爲C 語言最精華的內涵皆在內存操作中體現.我們之所以在嵌入式系統中使用C 語言進行程序設計,99%是因爲其強大的內存操作能力!
數據指針
在嵌入式系統的編程中,常常要求在特定的內存單元讀寫內容,彙編有對應的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語言重點知識點
學好嵌入式C語言是十分不容易的,下面小編爲大家帶來了嵌入式C語言的重點知識點,歡迎大家閱讀! 嵌入式C語言重點知識點 嵌入式LINUX嵌入式Linux 是將日益流行的Linux操作系統進行裁剪修改,使之能在嵌入式計算機系統 -
嵌入式C語言內存操作技巧
太窮了,只好自己改造一下。主要材料:植鞣革 一點點鉚釘 一點點舊拖鞋 一雙,反正不是一隻502 隨意所需工具:剪刀一把製作步驟:第1步:第2步:第3步:第4步:第5步:第6步:第7步:第8步:第9步:第10步:什麼?過程描述?一切盡在不言中。這 -
C語言嵌入式編程小知識
嵌入式系統是指完成一種或幾種特定功能的計算機系統,具有自動化程度高,響應速度快等優點,目前已廣泛應用於消費電子,工業控制等領域。嵌入式系統受其使用的硬件以及運行環境的限制,非常注重代碼的時間和空間效率,因此選擇一 -
嵌入式C語言編程小知識
嵌入式系統是用來控制或者監視機器、裝置、工廠等大規模設備的系統。下面爲大家整理了一些嵌入式C語言編程小知識,一起來看看吧! 1. 流水線被指令填滿時才能發揮最大效能即每時鐘週期完成一條指令的執行(僅指單週期 -
嵌入式C語言編程知識總結
嵌入式C語言是作爲嵌入式Linux開發的基礎語言,也是學習嵌入式的必備語言。下面是小編分享的嵌入式C語言編程知識總結,一起來看一下吧。1. 流水線被指令填滿時才能發揮最大效能,即每時鐘週期完成一條指令的執行(僅指單週 -
嵌入式C語言編程小知識總結
當我們對人生或者事物有了新的思考時,可以將其記錄在心得體會中,這樣能夠培養人思考的習慣。應該怎麼寫才合適呢?下面是小編收集整理的教師師德讀書心得,僅供參考,大家一起來看看吧。教師師德讀書心得1通過本章節的學習,讓 -
2017嵌入式系統開發工程師知識點:嵌入式系統簡介
嵌入式系統是一種"完全嵌入受控器件內部,爲特定應用而設計的專用計算機系統",根據英國電氣工程師協會的定義,嵌入式系統爲控制、監視或輔助設備、機器或用於工廠運作的設備。YJBYS小編下面爲你整理了2017嵌入式系統開發 -
盤點嵌入式系統開發工程師考試知識點
嵌入式系統是一個控制程序存儲在ROM中的嵌入式處理器控制板。下面是關於嵌入式系統開發工程師考試知識點,歡迎大家前來學習!1、嵌入式系統的定義(1)定義:以應用爲中心,以計算機技術爲基礎,軟硬件可裁剪,適應應用系統對功能 -
2017嵌入式系統開發工程師考試重要知識點
與個人計算機這樣的通用計算機系統不同,嵌入式系統通常執行的是帶有特定要求的預先定義的任務。YJBYS小編下面爲你整理了2017嵌入式系統開發工程師考試重要知識點,希望對你有所幫助。 1、嵌入式微處理器體系結構(1) -
2016嵌入式系統開發技術知識點:儲存器
存儲器的任務是存儲程序和數據。它分爲內置存儲器和擴充存儲器兩部分。內置又分爲片內存儲器和片外存儲器兩部分。擴充存儲器通常做成插拔形式,需要時才插入宿主設備使用。存儲器大多數是由半導體集成電路組成。按照其