1. 程式人生 > >裸奔和rtos下開發的差異分析

裸奔和rtos下開發的差異分析

    嵌入式裝置網路化、u盤化、功能複雜化的趨勢,使越來越多的、過去可以用裸奔實現的嵌入式產品,產生了應用作業系統的需求。     而人力成本的持續上升、晶片成本的連續下降,以及cpu效能的迅速提高,又為大面積應用作業系統提供了物質基礎。     本文和大家一起討論一下,從裸奔到作業系統,我們將面對什麼挑戰。 1、速度     我們首先面對的,將是cpu執行速度的問題,毋庸置疑,作業系統排程需要cpu開銷,需要cpu有更高的速度來彌補;再者,嵌入式系統經常用於實時控制,需要較高的定時精度,縮短tick時間間隔有利於提高控制精度,嵌入式系統中經常使用1mS甚至更短的tick間隔。然而,tick間隔越短,排程開銷就越高,同樣需要更高的cpu速度來彌補。當前日益提高的嵌入式cpu的效能,甚至微控制器都32位了,很好地回答了這個問題。      2、記憶體容量     先討論一個問題,一個原先需要50K記憶體的裸奔程式,如果移植到自身開銷1K記憶體的RTOS下面,需要增加多少記憶體?是51K嗎?     有許多嵌入式作業系統,都把執行作業系統的記憶體開銷作為主要效能指標,有些甚至聲稱不到1K記憶體就可以執行。但我們千萬不要被誤導,以為用作業系統需要的記憶體與裸機差不多,只要比裸奔程式多那麼1K、2K就行了。作業系統會使應用程式所需要的記憶體暴增,使用作業系統所增加的記憶體需求,主要來自以下方面: 1)    執行作業系統本身需要的記憶體。 2)    建立執行緒控制塊、訊息控制塊等作業系統元件需要的記憶體。 3)    每個執行緒配置獨立的棧所增加的記憶體需求。    其中第一項很好理解,幾乎所有作業系統都會給出這個指標。第二項也容易理解,不用作業系統的情況下,我們常常定義標誌位或全域性變數來在不同模組之間傳遞資訊,需要的記憶體就很少。而作業系統模式下,需要用到同步、互斥、執行緒間交換資料等,這就需要使用訊號量、郵箱等作業系統元件,訊號量需要分配訊號量控制塊,郵箱需要分配郵箱控制塊……,這些,都需要消耗可觀的記憶體。許多作業系統標明的,僅僅是OS本身執行需要的記憶體,並不包括訊號量控制塊拉、郵箱控制塊拉等等這些作業系統元件需要的記憶體。我們知道,一個僅執行OS的系統,是毫無意義的,真正實現產品功能的,是應用程式。而djyos的si版本,大約需要的10K記憶體,則包含了一定數量的事件控制塊、訊號量控制塊等作業系統元件所需記憶體的條件下的,完全滿足一個小型系統所需。     說了半天,其實也只講了作業系統對記憶體需求的冰山一角,OS下程式設計,對記憶體需求的影響最大的,當屬OS的多執行緒併發特性,這使得我們要為每一個執行緒分配獨立的棧。下面我們定性分析一下棧獨立化帶來的記憶體需求變化。棧是用來儲存函式引數和區域性變數的,可以說,有函式呼叫,就有區域性變數。在單執行緒環境下,應用程式需要的棧,幾乎就是main函式需要的棧,而在多執行緒環境下,每個執行緒的棧是獨立的,分別等於該執行緒的執行緒執行函式所需要的棧,而系統總的棧需求,就是所有執行緒的棧需求之和。     假設有一不使用OS的應用程式,main函式如下: void main(void) {     while(1)     {         func1();    //本函式需要10K棧         func2();    //本函式需要5K棧         func3();    //本函式需要9K棧         func4();    //本函式需要8K棧         func5();    //本函式需要9K棧     } }     在超級迴圈中,分別呼叫了func1~func5這5個函式,他們的棧需求分別是10K、5K、9K、8K、9K。呼叫func1時,系統分配10K的ram作為棧,func1函式返回,這10K空間將被釋放,並且再次分配給func2使用,所以,整個程式的棧需求,就是這5個函式中需要棧最多的那個函式需要的棧空間:10K。     如果要把這個程式移植到OS下,最簡單的方法就是建立5個執行緒來呼叫func1~5這5個函式,這5個執行緒需要的棧分別是10K、5K、9K、8K、9K,而這5個棧是獨立的,不能共用,程式總共需要的棧空間是(10+5+9+8+9)=41K,執行緒棧一般是從堆中動態分配的,考慮到動態分配本身的開銷,硬體須準備50K以上的記憶體用於程式的執行棧。一下子增長到5倍,沒想到吧。     可見,上作業系統,雖然作業系統本身不需要很大記憶體,但會極度增加應用程式的記憶體需求。做專案時,一是不要盲目上OS,要根據需求綜合考慮,二是設計硬體系統時,應該充分考慮到記憶體方面的需求,配置充足的記憶體。 3、人

    任何產品都是由人開發的,所以,討論嵌入式產品開發的任何話題,都不能離開人的因素,科技以人為本嘛!從裸奔到作業系統,那麼程式設計師,也將由編寫裸奔程式轉為在作業系統下程式設計。這些迅速、大量增加的程式設計師,他們可能習慣了在裸奔環境下程式設計,他們可能是化工、建築、地質等不同行業的專家,他們也許已經上了年紀,沒有太多的精力學習多執行緒程式設計等知識。然而,涉及到專業的程式,仍然離不開他們,如何從技術上降低他們的入門門檻,是一個亟需考慮的問題。但是,普通的作業系統下,你不掌握執行緒控制技術,就無法編寫正確的程式。djyos允許你按事件程式設計,沒有任何跟執行緒相關的api函式,無需程式設計師掌握執行緒技術,客觀上降低了裸奔到OS程式設計的轉換技術門檻。