C語言嵌入式系統程式設計修煉之軟體架構篇 1

2021-05-27 20:51:48 字數 1572 閱讀 5227

單任務程式典型架構

(1)從cpu復位時的指定位址開始執行;

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

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

a.初試化各硬體裝置;

b.初始化各軟體模組;

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

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

while(1)

有的程式設計師這樣寫:

for(;;)

這個語法沒有確切表達**的含義,我們從for(;;)看不出什麼,只有弄明白for(;;)在c語言中意味著無條件迴圈才明白其意。

下面是幾個"著名"的死迴圈:

(1)作業系統是死迴圈;

(2)win32程式是死迴圈;

(3)嵌入式系統軟體是死迴圈;

(4)多執行緒程式的執行緒處理函式是死迴圈。

你可能會辯駁,大聲說:"凡事都不是絕對的,2、3、4都可以不是死迴圈"。yes,you are right,但是你得不到鮮花和掌聲。實際上,這是乙個沒有太大意義的牛角尖,因為這個世界從來不需要乙個處理完幾個訊息就喊著要os殺死它的win32程式,不需要乙個剛開始run就自行了斷的嵌入式系統,不需要莫名其妙啟動乙個做一點事就乾掉自己的執行緒。有時候,過於嚴謹製造的不是便利而是麻煩。君不見,五層的tcp/ip協議棧超越嚴謹的iso/osi七層協議棧大行其道成為事實上的標準?

經常有網友討論:

printf("%d,%d",++i,i++); /* 輸出是什麼?*/

c = a+++b; /* c=? */

等類似問題。面對這些問題,我們只能發出由衷的感慨:世界上還有很多有意義的事情等著我們去消化攝入的食物。

實際上,嵌入式系統要執行到世界末日。

中斷服務程式

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

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

(1)不能返回值;

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

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

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

在某專案的開發中,我們設計了乙個佇列,在中斷服務程式中,只是將中斷型別新增入該佇列中,在主程式的死迴圈中不斷掃瞄中斷佇列是否有中斷,有則取出佇列中的第乙個中斷型別,進行相應處理。

/* 存放中斷的佇列 */

typedef struct tagintqueue

intqueue;

intqueue lpintqueuehead;

__interrupt isrexample ()

在主程式迴圈中判斷是否有中斷:

while(1)}}

按上述方法設計的中斷服務程式很小,實際的工作都交由主程式執行了。

C語言嵌入式系統程式設計修煉(三)

c語言嵌入式系統程式設計修煉 三 使用巨集定義在c 語言中,巨集是產生內嵌 的唯一方法。對於嵌入式系統而言,為了能達到效能要求,巨集是一種很好的代替函式的方法。寫乙個 標準 巨集 min 這個巨集輸入兩個引數並返回較小的乙個 錯誤做法 define min a,b a b a b 正確做法 defi...

C語言嵌入式系統程式設計修煉之螢幕操作

漢字處理 現在要解決的問題是,嵌入式系統中經常要使用的並非是完整的漢字型檔,往往只是需要提供數量有限的漢字供必要的顯示功能。例如,乙個微波爐的lcd上沒有必要提供顯示 電子郵件 的功能 乙個提供漢字顯示功能的空調的lcd上不需要顯示一條 短訊息 諸如此類。但是一部 手機 小靈通則通常需要包括較完整的...

C語言嵌入式系統程式設計修煉之螢幕操作

c語言嵌入式系統程式設計修煉之螢幕操作 出處 天極網 2005 06 20 15 54 現在要解決的問題是,嵌入式系統中經常要使用的並非是完整的漢字型檔,往往只是需要提供數量有限的漢字供必要的顯示功能 漢字處理 現在要解決的問題是,嵌入式系統中經常要使用的並非是完整的漢 字型檔,往往只是需要提供數量...