嵌入式程式設計

2021-10-01 13:31:00 字數 1416 閱讀 7589

對於簡單的應用程式,輪詢(許多時候也被稱作超級迴圈)實現起來比較簡單,而且非常適合簡單任務(見圖4.4)。不過,當應用程式變得複雜或者對處理能力的要求更高時,輪詢就不合適了。例如,當乙個程序占用時間過長,其他模組在這段時間內就不會收到處理器的任何服務。即便不需要任何處理,處理器也得一直執行輪詢程式,這也是輪詢方式的另外-乙個缺陷。

對於一些需要低功耗的應用,處理器可以在中斷服務程式中執行處理,當沒有任務需要處理時進入休眠模式。外部中斷源或者晶元外設都可以觸發中斷,並喚醒處理器。在中斷驅動的應用程式中,不同裝置的中斷可以被設定為不同的優先順序,這樣即便低優先順序的中斷服務正在執行,也可以被高優先順序的中斷搶占處理器使用權,從而使低優先順序處於暫停狀態,因此高優先順序中斷的等待時間是很短的。

許多情況下,應用程式可以將中斷驅動和輪詢這兩種方式組合使用(見圖4.6)。通過軟體變數傳遞,中斷處理程式和主處理流程間可以進行資訊交換。將乙個處理任務分割為中斷服務程式和主流程中的處理,可以減少中斷服務的持續時間,以便低優先順序的中斷能有更多的機會獲得服務。而且,系統也可以在沒有任務需要處理的時候進人休眠模式。如圖4.6所示,應用程式就被分為了a、b和c三個程序,而有時候像這樣進行拆分可能不是那麼容易,只能作為乙個大的組合進行處理。

有些情況下,乙個處理任務可能會占用大量的時間,這樣像圖4.6所示的處理就不合適了。如果任務a的執行需要太長的時間,任務b和c可能就無法及時響應外設模組的請求,這樣可能會導致系統失敗。針對這種情況,一般的解決方案如下:

(1)將乙個長時間的處理任務劃分為一系列的狀態,每次處理任務時,只執行一種狀態;

(2)使用實時作業系統(rtos)處理多工。

使用第一種方法,乙個任務被劃分為了幾個部分,可以使用軟體變數追蹤任務的狀態(見圖4.7)。每次執行任務時,狀態資訊就會得到更新;這樣下次再執行這個任務時,就可以繼續.上次的處理了。

因為在大迴圈中,任務處理的時間減少,主迴圈中的其他任務就可以獲得更多的執行機會。儘管任務處理的總時間沒有改變(反而會由於狀態儲存和恢復帶來的開銷,總時間會增加),但系統的響應速度更快了。當應用程式非常複雜時,手動拆分任務就有點不切實際了。

對於那些更加複雜的應用程式,可以考慮使用實時作業系統(rtos)。rtos將處理器時間劃分為多個時間片,在有多個應用程序執行時,只有乙個程序會獲得時間片。使用rtos,需要有定時器產生週期性的中斷請求。當乙個時間片的時間到時,rtos的任務排程器會由定時器中斷觸發,並判斷是否需要執行上下文切換。如果需要進行上下文切換,任務排程會暫停正在執行的任務,並切換至下乙個準備就緒的任務。

嵌入式程式設計

1 interrupt double compute area double radis 1 isr不能返回乙個值。2 isr不能傳遞引數。3 在許多處理器中浮點是不可重入的。4 printf 經常有重入和效能上的問題,所以一般不使用printf 2.volatile 1 volatile的語法和c...

嵌入式Linux C程式設計

一 前言 一切,都想從不一樣做起。大學,原以為會和我當時高中想象的那樣,可以談場轟轟烈烈的戀愛,可以自由自在的旅行,可以忘乎所以,盡己之所興。如今,大三結束。驀然回首,卻發現自己浪費了那麼多改變自己的機會。如今,大學只剩最後一年,我要用這最後的時間去彌補曾經所浪費的一切,從現在開始,朝著自己的目標勇...

嵌入式C程式設計小結

最近在看公司嵌入式開發的文件和c語言 真佩服那些設計的人員,從需求分析說明書 時序圖 概要設計 詳細設計 到code階段,都做得很細緻。而且純粹是c語言開發,軟體設計人員必須對硬體有很深的了解才行,我看了一下裡面的code,足足有幾百多個.h和.c檔案,各個模組寫得很細緻。專案都快接近尾聲了,我什麼...