一、static
關鍵字static,修飾變數時:
1、限制該變數的作用域:比如靜態全域性變數,只能在該模組中使用(本c檔案中)。
2、決定該變數的儲存位置:修飾為靜態的變數,儲存在靜態資料區(非堆疊內)。(同比,全域性變數也都存放在靜態資料區中。)
帶初值和不帶初值的靜態變數:(以ti dsp 54xx為例)
a.不帶初值的靜態變數,儲存在.bss段中。
b.帶初值的靜態變數,儲存在.bss段中,但其初值儲存在.init中。在dsp booter完成載入初始化後已經將init段的值賦值到.bss對應變數中。
關鍵字static,修飾函式時:限制該函式的作用域,僅能在本模組中使用(本c檔案中)。
結論:static關鍵字對於使用者而言,最重要的是對變數或函式作用域的限制。
二、const
關鍵字const意味著「不變的」:
1、什麼時候該用:定義乙個函式時如果在輸入引數前加上const,可以防止該輸入變數被改寫而引出的錯誤;函式定義時使用const可以起到函式api自注釋作用;
2、怎麼用:
以下摘錄經典面試題中的例子:
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是乙個常整型數。
第三個意味著a是乙個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。
第四個意思a是乙個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。
最後乙個意味著a是乙個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。
三、volatile
關鍵字volatile意味著「易改變的」:
修飾為volatile的變數,編譯器不會對其進行任何優化,每次求值時會到指定位址(物理或對映)去讀取。因此適用於「並行裝置的硬體暫存器(如:狀態暫存器) ;乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables) ;多執行緒應用中被幾個任務共享的變數 」,我個人只用到在io和中斷中,至於多執行緒的問題有個帖子可供參考。
四、堆與棧(heap and stack)
1) 堆是由使用者維護的。比如我們malloc一段空間,此時開闢的空間便在堆中,呼叫free時再釋放。過於頻繁的malloc與free會導致堆中產生碎片(乙個空間的位址不連續),影響讀寫速度。
2) 棧是由編譯器控制的,我們無需干涉。比如我們定義的區域性變數或是呼叫了乙個函式。以函式呼叫為例,此時系統會將現場資料(主要是部分暫存器中的資料,如pc的儲存可以在呼叫結束時程式回歸此處繼續執行)壓入棧內,將暫存器空出迎接被調函式中的一系列計算和控制。被調函式執行完後再進行出棧操作,流程繼續。
嵌入式C語言那點事(一)幾個重要關鍵字
一 static 關鍵字static,修飾變數時 1 限制該變數的作用域 比如靜態全域性變數,只能在該模組中使用 本c檔案中 2 決定該變數的儲存位置 修飾為靜態的變數,儲存在靜態資料區 非堆疊內 同比,全域性變數也都存放在靜態資料區中。帶初值和不帶初值的靜態變數 以ti dsp 54xx為例 a....
串列埠 除錯 log軟體 嵌入式軟體面試那點事
首先說個大概的,嵌入式軟體需要掌握什麼東西?對微控制器的熟悉程度 包括中斷系統 各種外設模組 時鐘系統等 對通訊協議的熟悉程度 常見的有spi uart i2c等 掌握基本的資料結構 如佇列 棧 鍊錶 掌握基本的演算法 多種排序演算法,資料結構中需要的一些演算法 其實嵌入式的東西很龐雜,不是一下子就...
嵌入式學習(二) 嵌入式系統C 語言
1 從 cpu 復位時的指定位址開始執行 2 跳轉至彙編 startup 處執行 3 跳轉至使用者主程式 main 執行,在 main 中完成 a.初試化各硬體裝置 b.初始化各軟體模組 c.進入死迴圈 無限迴圈 d呼叫各模組的處理函式 下面是幾個 著名 的死迴圈 1 作業系統是死迴圈 2 win3...