歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

嵌入式C語言學習筆記

一、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的保存可以在調用結束時程序回歸此處繼續運行)壓入棧內,將寄存器空出迎接被調函數中的一系列計算和控制。被調函數執行完後再進行出棧操作,流程繼續。

Copyright © Linux教程網 All Rights Reserved