嵌入式C學習

2021-10-18 18:27:57 字數 2579 閱讀 9964

靜態變數與靜態函式

extern變數

關鍵字const和巨集定義define

程式中所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。常見的位運算有:and運算&、or運算|、xor運算^、not運算~、shl運算《和shr運算》。

and運算通常用於二進位制的取位操作,例如乙個數 and 1的結果就是取二進位制的最末位。這可以用來判斷乙個整數的奇偶,二進位制的最末位為0表示該數為偶數,最末位為1表示該數為奇數。

相同位的兩個數字都為1,則為1;若有乙個不為1,則為0。

例如:00101

11100

(&;and)

00100

or運算通常用於二進位制特定位上的無條件賦值,例如乙個數or 1的結果就是把二進位制最末位強行變成1。如果需要把二進位制最末位變成0,對這個數or 1之後再減一就可以了,其實際意義就是把這個數強行變成最接近的偶數。

相同位只要乙個為1即為1。

例如:00101

11100

(|;or)

11101

xor運算常用於對等長二進位制模式按位或二進位制數的每一位執行邏輯按位異或操作。 操作的結果是如果某位不同則該位為1, 否則該位為0。

xor運算的逆運算是它本身,也就是說兩次異或同乙個數最後結果不變,即(a xor b) xor b = a。xor運算可以用於簡單的加密。

相同位不同則為1,相同則為0。

例如:00101

11100

(^;xor)

11001

not運算的定義是把記憶體中的0和1全部取反。使用not運算時要格外小心,你需要注意整數型別有沒有符號。如果not的物件是無符號整數(不能表示負數),那麼得到的值就是它與該型別上界的差。

無符號整數與有符號整數:計算機的數是用二進位制表示的,最左邊的這一位一般用來表述該數的正負,如果存在這種情況則為有符號整數,否則為無符號整數。

a shl b就表示把a轉為二進位制後左移b位,即在後面添b個0。例如100的二進位制1100100,而110010000轉成十進位制是400,那麼100 shl 2 = 400。可以看出,a shl b的值實際上就是a乘以2的b次方,因為在二進位制數後添乙個0就相當於該數乘以2。

a shl b就表示把a轉為二進位制後左移b位(在後面添b個0)。例如100的二進位制為1100100,而110010000轉成十進位制是400,那麼100 shl 2 = 400。可以看出,a shl b的值實際上就是a乘以2的b次方,因為在二進位制數後添乙個0就相當於該數乘以2。

優先等級

位運算1

not運算

2shl運算、shr運算

3and運算

4xor運算

5or運算

1.不改變其他位值,只對某幾位設值。

方法:先對需要設定的位使用與操作進行清零,然後使用或操作設定相應值。

2.移位操作提高**可讀性和可重用性

3.取反操作提高**的可讀性

靜態變數(static variable)在計算機程式設計領域指在程式執行前系統就為之靜態分配儲存空間的一類變數,同時在執行時中不再改變分配情況。

自動變數(automatic variable)在計算機程式設計領域指的是區域性作用域變數,具體來說即是在控制流進入變數作用域時系統自動為其分配儲存空間,並在離開作用域時釋放空間的一類變數。

靜態函式函式的結果不會被訪問或者修改物件,如果靜態函式宣告以後就會對其他原始檔隱藏,無法進行呼叫。

1.利用靜態的特性可以在不同檔案裡定義同名函式和同名變數,而不必擔心命名衝突。

2.儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。在下次使用靜態變數時,則不會在去初始化。

3.預設初始化初值為0。在靜態儲存區共有兩種變數儲存:全域性變數和 static 變數,而且在靜態資料區,記憶體中所有的位元組預設值都是0x00

static最主要的功能是隱藏,其次因為static變數存放在靜態儲存區,所以它具備永續性和預設值0。

extern最基本的用法就是宣告全域性變數,需要注意兩點,一是「聲名」,二是「全域性變數」。需要注意的是,聲名和定義是有去別的,聲名只是指出了變數的名字,並沒有分配儲存空間,定義是指出變數的名字同時為變數分配儲存空間,定義當中包含聲名。對於extern聲名變數可以多次,而定義只有一次。

(1) 編譯器處理方式不同

define巨集是在預處理階段展開。

const常量是編譯執行階段使用。

(2) 型別和安全檢查不同

define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。

(3) 儲存方式不同

define巨集僅僅是展開,有多少地方使用,就展開多少次,不會分配記憶體。

const常量會在記憶體中分配(可以是堆中也可以是棧中)。

(4)除錯方式不同

define不可以被除錯

const可以被除錯

(1)const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。

(2)有些整合化的除錯工具可以對const常量進行除錯,但是不能對巨集常量進行除錯。

(3)const可節省空間,避免不必要的記憶體分配,提高效率。

嵌入式C學習

位域函式指標 定義方式 結構體做函式引數傳遞有三種方式 1 用結構體的單個成員作為函式引數,向函式傳遞結構體的單個成員 屬於傳值呼叫,不會影響相應的實參結構體的值 分為值傳遞和位址傳遞。2 用結構體變數做函式引數,向函式傳遞結構體完整結構 屬於傳值呼叫,不會影響相應的實參結構體的值 屬於位址傳遞。3...

嵌入式學習(二) 嵌入式系統C 語言

1 從 cpu 復位時的指定位址開始執行 2 跳轉至彙編 startup 處執行 3 跳轉至使用者主程式 main 執行,在 main 中完成 a.初試化各硬體裝置 b.初始化各軟體模組 c.進入死迴圈 無限迴圈 d呼叫各模組的處理函式 下面是幾個 著名 的死迴圈 1 作業系統是死迴圈 2 win3...

嵌入式學習

1 c 語言 第二版譚浩強。2 資料結構 c語言版。3 實用 c 程式設計 4 學習51 微控制器,加深對中斷的理解。5 學習 arm微控制器。1 細讀 arm微控制器基礎與實戰 周立功編寫。2 細讀相關晶元的原版英文文件。如 arm920te.pdf s3c2410 1.2.pdf。6 學習uco...