例程的分析和總結

2021-06-28 19:38:19 字數 2083 閱讀 2385

分析1:volatile 是什麼?怎麼用?

答:簡單的說,就是不讓編譯器進行優化,即每次讀取或者修改值的時候,都必須重新從內

存或者暫存器中讀取或者修改,防止從快取處讀取的值是過期了的,所以加了這個volatile

可以保證每次讀的值絕對是實時的:

一般說來,volatile 用在如下的幾個地方:

1.中斷服務程式中修改的供其它程式檢測的變數需要加volatile;

2.多工環境下各任務間共享的標誌應該加volatile;

3.儲存器對映的硬體暫存器通常也要加volatile 說明,因為每次對它的讀寫都可能由不同

意義。我認為這是區分c 程式設計師和嵌入式系統程式設計師的最基本的問題。搞嵌入式的傢伙們經常

同硬體、中斷、rtos 等等打交道,所有這些都要求用到 volatile 變數。不懂得volatile

的內容將會帶來災難。假設被面試者正確地回答了這是問題(嗯,懷疑是否會是這樣),我

將稍微深究一下,看一下這傢伙是不是直正懂得volatile 完全的重要性。

分析2:__i、 __o 、__io 是什麼?

答:如下:

__i :輸入口。既然是輸入,那麼暫存器的值就隨時會外部修改,那就不能進行優化,每次

都要重新從暫存器中讀取。也不能寫,即唯讀,不然就不是輸入而是輸出了。

__o :輸出口,也不能進行優化,不然你連續兩次輸出相同值,編譯器認為沒改變,就忽略

了後面那一次輸出,假如外部在兩次輸出中間修改了值,那就影響輸出。

__io:輸入輸出口,同上。

分析3:為什麼加下劃線?

答:原因是避免命名衝突,一般巨集定義都是大寫,但因為這裡的字母比較少,所以再新增下

劃線來區分。這樣一般都可以避免命名衝突問題,因為很少人這樣命名,這樣命名的人肯定

知道這些是有什麼用的。

經常寫大工程時,都會發現老是命名衝突,要不是全域性變數衝突,要不就是巨集定義衝突,所

以我們要盡量避免這些問題,不然出問題了都不知道問題在**。

分析4:typedef 是什麼意思,怎麼使用?

答:typedef 為c 語言的關鍵字,作用是為一種資料型別定義乙個新名字。這裡的資料型別

包括內部資料型別(int,char 等)和自定義的資料型別(struct 等);在程式設計中使用typedef

目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜

的型別宣告。

1) typedef 的最簡單使用,例如:typedef long byte_4;表示給已知資料型別long 起個新

名字,叫byte_4

2) typedef 與結構結合使用

例如:typedef struct tagmystruct

mystruct;

這語句實際上完成兩個操作

操作1:定義乙個新的結構型別tagmystruct, struct 關鍵字和tagmystruct 一起,構成

了這個結構型別,不論是否有typedef,這個結構都存在。我們可以用struct tagmystruct

varname 來定義變數,但要注意,使用tagmystruct varname 來定義變數是不對的,因為

struct 和tagmystruct 合在一起才能表示乙個結構型別。

struct tagmystruct

;操作2:typedef 為這個新的結構起了乙個名字,叫mystruct。

typedef struct tagmystruct mystruct;

因此,mystruct 實際上相當於struct tagmystruct,我們可以使用mystruct

varname 來定義變數。

分析5:所以具體的typedef **解釋如下:

1)例:typedef unsigned int uint32_t;

表示使用uint32_t 符號表示unsigned int 符號

2)例:typedef __io uint32_t vu32;

表示使用vu32 符號表示typedef __io 符號

3)例:typedef unsigned short int uint16_t;

表示使用uint16_t 符號表示unsigned short int 符號

KSDK USB 例程分析

在usb example裡面檔案 lite為精簡版,省略了很多usb枝幹上的功能,保留了usb通訊部分的主幹功能,我使用的是全功能版。函式 board initpins 中,主要是port以及gpio相關的初始化。1 使能port的時鐘,當外設時鐘沒有開啟時,程式不能讀出外設暫存器的值,同時也不能使...

opencv例程分析(1)

show image include include opencv2 opencv.hpp include opencv2 core core.hpp include opencv2 highgui highgui.hpp using namespace cv using namespace std...

ZigBee HA示例程式分析

zigbee協議棧中自帶的homeautomation例程,雖然也是操作燈泡,但是,是通過zcl來統一處理的,符合ha profile規範,互連互操作性較好。下面就簡要分析以下zcl的使用。在任務陣列中,多定義了zcl層。technorati 標籤 zigbee ha 示例程式 osal sampl...