c中變數定義的三個修飾符
變數定義有三個修飾符值得注意,雖然它們與標準c是相同的,但是在嵌入式c語言中又有不同的含義。
1) static
在子函式中用static宣告的靜態變數依然是區域性變數,但是退出這個子函式後其值不消失。換一種理解是,只在第一次呼叫function1函式的時候,才執行靜態變數初始化操作"x = 0;",在第二次,第三次...呼叫到function1的時候,就不再對靜態變數x進行初始化操作了。下面的兩個函式呼叫function1和function2很好的說明了static關鍵字的作用。另外兩個函式中的區域性變數名都定義成了x,但是它們並不會相互影響,因為區域性變數的作用範圍僅限於定義它的函式內。
#include "msp430g2553.h"/*
定義乙個全域性變數y,用於接收函式的返回值
*/unsigned
char
y; unsigned
char function1(void
)unsigned
char function2(void
)void main(void
)
2) volatile
如果乙個變數的值可能會被程式操作之外的其它操作所改變,那麼你必需用volatile 宣告。在嵌入式系統中其它操作是:中斷服務程式的操作、硬體動作的操作。
用volatile宣告的變數是不會被編譯器優化掉的,如:
volatile unsigned char porta @0x0000;
porta做為乙個輸入埠,其值是由外部裝置決定的,由於外部裝置的變化是隨機的,因此第一次讀取的值和第二次讀取的值很可能不同,所以我們把它宣告為volatile變數。
a = porta;
a = porta;
由於porta是用volatile宣告的變數,編譯器不會把它優化成一句,而如果不是volatile宣告的編譯器就會將第二句優化掉,從而程式將會忽略輸入埠的變化。
通常把嵌入式裝置的所有外圍器件暫存器都宣告為volatile 的。
3) const
修飾符 const 可以用在任何變數之前, 告訴編譯器把此變數儲存在rom中。rom_var段是定位 const 變數的預設段
語法格式:#pragma const_seg 《段名》
例如:#pragma data_seg default
#pragma const_seg default
static int a;//變數 a 存放在預設的 ram 段 default_ram 中,default_ram是段名
static const int c0 = 10;//變數 c0 存放在預設的 rom 段 rom_var 中,rom_var是段名
此時編譯器選項-cc必需是開啟的。如果編譯器選項-cc必需是關閉的,則變數a和c0都定位在default_ram中。
例如:#pragma data_seg myvarseg
#pragma const_seg myconstseg
static int a; //變數 a 存放在段myvarseg中,myvarseg是段名
static const int c0 = 10; //變數 c0 存放在段 myconstseg 中,myconstseg是段名
此時編譯器選項-cc必需是開啟的。如果編譯器選項-cc必需是關閉的,則變數a和c0都定位在myvarseg中
C 常用關鍵字
abstract 抽象 as 像 base 基礎 bool 布林 break 中斷 byte 位元組 case 案例 catch 捕捉 char 字元 checked 檢查 class 類 const 常數 continue 繼續 decimal 表示金額的浮點型別 default 預設 deleg...
C 中不常用的關鍵字
mutable關鍵字 關鍵字mutable是c 中乙個不常用的關鍵字,他只能用於類的非靜態和非常量資料成員我們知道乙個物件的狀態由該物件的非靜態資料成員決定,所以隨著資料成員的改變,對像的狀態也會隨之發生變化 如果乙個類的成員函式被宣告為const型別,表示該函式不會改變物件的狀態,也就是該函式不會...
C 中不常用的關鍵字
c 中不常用的關鍵字 mutable關鍵字 關鍵字mutable是c 中乙個不常用的關鍵字,他只能用於類的非靜態和非常量資料成員我們知道乙個物件的狀態由該物件的非靜態資料成員決定,所以隨著資料成員的改變,對像的狀態也會隨之發生變化 如果乙個類的成員函式被宣告為const型別,表示該函式不會改變物件的...