C語言模組化程式設計

2021-04-24 08:30:05 字數 2712 閱讀 4048

c語言模組化程式設計

模組劃分

c語言模組化程式

設計需理解如下概念:

(1) 模組即是乙個.c檔案和乙個.h檔案的結合,標頭檔案(.h)中是對於該模組介面的宣告;

(2) 某模組提供給

其它模組呼叫的外部函式及資料需在.h中檔案中冠以extern關鍵字宣告;

(3) 模組內的函式和全域性變數需在.c檔案開頭冠以static關鍵字宣告;

(4) 永遠不要在.h檔案中定義變數!定義變數和宣告變數的區別在於定義會產生記憶體分配的操作,是彙編階段的概念;而宣告則只是告訴包含該宣告的模組在連線階段從其它模組尋找外部函式和變數。

乙個嵌入式系統通常包括兩類模組:

(1)硬體驅動模組,一種特定硬體對應乙個模組;

(2)軟體功能模組,其模組的劃分應滿足低偶合、高內聚的要求。

多工還是單任務

所謂"單任務系統"是指該系統不能支援多工併發操作,巨集觀序列地執行乙個任務。而多工系統則可以巨集觀並行(微觀上可能序列)地"同時"執行多個任務。

多工的併發執行通常依賴於乙個多工作業系統(os),多工os的核心是系統排程器,它使用任務控制塊(tcb)來管理任務排程功能。tcb包括任務的當前狀態、優先順序、要等待的事件或資源、任務程式碼的起始位址、初始堆疊指標等資訊。排程器在任務被啟用時,要用到這些資訊。此外,tcb還被用來存放任務的"上下文"(context)。任務的上下文就是當乙個執行中的任務被停止時,所要儲存的所有資訊。通常,上下文就是計算機當前的狀態,也即各個暫存器的內容。

當發生任務切換時,當前執行的任務的上下文被存入tcb,並將要被執行的任務的上下文從它的tcb中取出,放入各個暫存器中。

究竟選擇多工還是單任務方式,依賴於軟體的體系是否龐大。例如,絕大多數手機程式都是多工的,但也有一些小靈通的協議棧是單任務的,沒有作業系統,它們的主程式輪流呼叫各個軟體模組的處理程式,模擬多工環境。

單任務程式典型架構

(1)從cpu復位時的指定位址

開始執行;

(2)跳轉至彙編**startup處執行;

(3)跳轉至使用者主程式main執行,在main中完成:

a.初試化各硬體裝置; 

b.初始化各軟體模組;

c.進入死迴圈(無限迴圈),呼叫各模組的處理函式

使用者主程式和各模組的處理函式都以c語言完成。使用者主程式最後都進入了乙個死迴圈,其首選方案是:

while(1) 

中斷服務程式

中斷是嵌入式系統中重要的組成部分,但是在標準c中不包含中斷。許多編譯開發商在標準c上增加了對中斷的支援,提供新的關鍵字用於標示中斷服務程式(isr),類似於__interrupt、#program interrupt等。當乙個函式被定義為isr的時候,編譯器會自動為該函式增加中斷服務程式所需要的中斷現場入棧和出棧**。

中斷服務程式需要滿足如下要求:

(1)不能返回值;

(2)不能向isr傳遞引數;

(3) isr應該盡可能的短小精悍;

(4) printf(char * lpformatstring,…)函式會帶來重入和效能問題,不能在isr中採用。

硬體驅動模組

乙個硬體驅動模組通常應包括如下函式:

(1)中斷服務程式isr

(2)硬體初始化

a.修改暫存器,設定硬體引數(如uart應設定其波特率,ad/da裝置應設定其取樣速率等);

b.將中斷服務程式入口位址寫入中斷向量表:

/* 設定中斷向量表 */

m_myptr = make_far_pointer(0l); /* 返回void far型指標void far * */ 

m_myptr += itype_uart; /* itype_uart: uart中斷服務程式 */

/* 相對於中斷向量表首位址的偏移 */

*m_myptr = &uart _isr; /* uart _isr:uart的中斷服務程式 */ 

(3)設定cpu針對該硬體的控制線

a.如果控制線可作pio(可程式設計i/o)和控制訊號用,則設定cpu內部對應暫存器使其作為控制訊號;

b.設定cpu內部的針對該裝置的中斷遮蔽位,設定中斷方式(電平觸發還是邊緣觸發)。

(4)提供一系列針對該裝置的操作介面函式。例如,對於lcd,其驅動模組應提供繪製畫素、畫線、繪製矩陣、顯示字元點陣等函式;而對於實時鐘,其驅動模組則需提供獲取時間、設定時間等函式。

c的物件導向化

在物件導向的語言裡面,出現了類的概念。類是對特定資料的特定操作的集合體。類包含了兩個範疇:資料和操作。而c語言中的struct僅僅是資料的集合,我們可以利用函式指標將struct模擬為乙個包含資料和操作的"類"。下面的c程式模擬了乙個最簡單的"類":

#ifndef c_class

#define c_class struct

#endif

c_class a ; 

我們可以利用c語言模擬出物件導向的三個特性:封裝、

繼承和多型,但是更多的時候,我們只是需要將資料與行為封裝以解決軟體結構混亂的問題。c模擬物件導向思想的目的不在於模擬行為本身,而在於解決某些情況下使用c語言

程式設計時程式整體框架結構分散、資料和函式脫節的問題。我們在後續章節會看到這樣的例子。 

總結本篇介紹了嵌入式系統程式設計軟體架構方面的知識,主要包括模組劃分、多工還是單任務選取、單任務程式典型架構、中斷服務程式、硬體驅動模組設計等,從巨集觀上給出了乙個嵌入式系統軟體所包含的主要元素。

請記住:軟體結構是軟體的靈魂!結構混亂的程式面目可憎,除錯、測試、維護、公升級都極度困難。

C語言之模組化程式設計

1 為什麼使用函式?函式就是功能 每個函式代表特定的功能,函式的名字應反應其代表的功能。2 怎麼定義函式?函式定義時需指定函式的型別 即函式返回值的型別。函式定義可大致分為以下三類 無參函式 型別名 函式名 void 可省略 有參函式 型別名 函式名 形參 空函式 程式設計時往往需要確定若干個模組,...

C語言模組化程式設計概念理解

模組即乙個 c 檔案和乙個 h 檔案的結合,h 標頭檔案是對該模組介面的宣告。某模組提供給其他模組呼叫的外部函式及資料需在 h 檔案中冠以 extern 關鍵字宣告。模組內的函式和全域性變數需在 c 檔案頭冠以 static 關鍵字宣告。永遠不要再 h 檔案中定義變數。定義變數和宣告變數的區別在於定...

C語言模組化程式設計的例子

以往寫c語言程式都是乙個檔案裡面寫個幾 十 幾百行,在練演算法的時候還可以,現在搞開發需要模組化程式設計,所謂模組化程式設計,就是指乙個程式包含多個原始檔 c 檔案和 h 檔案 每個 c 檔案可以被稱為乙個模組。1 例程的檔案結構 2 各檔案 main.c 原始碼 include include i...