嵌入式設(shè)備網(wǎng)絡(luò)化、u盤化、功能復(fù)雜化的趨勢,使越來越多的、過去可以用裸奔實現(xiàn)的嵌入式產(chǎn)品,產(chǎn)生了應(yīng)用操作系統(tǒng)的需求。
而人力成本的持續(xù)上升、芯片成本的連續(xù)下降,以及cpu性能的迅速提高,又為大面積應(yīng)用操作系統(tǒng)提供了物質(zhì)基礎(chǔ)。
1、速度
我們首先面對的,將是cpu運行速度的問題,毋庸置疑,操作系統(tǒng)調(diào)度需要cpu開銷,需要cpu有更高的速度來彌補;再者,嵌入式系統(tǒng)經(jīng)常用于實時控制,需要較高的定時精度,縮短tick時間間隔有利于提高控制精度,嵌入式系統(tǒng)中經(jīng)常使用1mS甚至更短的tick間隔。然而,tick間隔越短,調(diào)度開銷就越高,同樣需要更高的cpu速度來彌補。當(dāng)前日益提高的嵌入式cpu的性能,甚至單片機都32位了,很好地回答了這個問題。
2、內(nèi)存容量
先討論一個問題,一個原先需要50K內(nèi)存的裸奔程序,如果移植到自身開銷1K內(nèi)存的RTOS下面,需要增加多少內(nèi)存?是51K嗎?
有許多嵌入式操作系統(tǒng),都把運行操作系統(tǒng)的內(nèi)存開銷作為主要性能指標,有些甚至聲稱不到1K內(nèi)存就可以運行。但我們千萬不要被誤導(dǎo),以為用操作系統(tǒng)需要的內(nèi)存與裸機差不多,只要比裸奔程序多那么1K、2K就行了。操作系統(tǒng)會使應(yīng)用程序所需要的內(nèi)存暴增,使用操作系統(tǒng)所增加的內(nèi)存需求,主要來自以下方面:
1) 運行操作系統(tǒng)本身需要的內(nèi)存。2) 創(chuàng)建線程控制塊、消息控制塊等操作系統(tǒng)組件需要的內(nèi)存。3) 每個線程配置獨立的棧所增加的內(nèi)存需求。
其中第一項很好理解,幾乎所有操作系統(tǒng)都會給出這個指標。第二項也容易理解,不用操作系統(tǒng)的情況下,我們常常定義標志位或全局變量來在不同模塊之間傳遞信息,需要的內(nèi)存就很少。而操作系統(tǒng)模式下,需要用到同步、互斥、線程間交換數(shù)據(jù)等,這就需要使用信號量、郵箱等操作系統(tǒng)組件,信號量需要分配信號量控制塊,郵箱需要分配郵箱控制塊……,這些,都需要消耗可觀的內(nèi)存。許多操作系統(tǒng)標明的,僅僅是OS本身運行需要的內(nèi)存,并不包括信號量控制塊拉、郵箱控制塊拉等等這些操作系統(tǒng)組件需要的內(nèi)存。我們知道,一個僅運行OS的系統(tǒng),是毫無意義的,真正實現(xiàn)產(chǎn)品功能的,是應(yīng)用程序。而djyos的si版本,大約需要的10K內(nèi)存,則包含了一定數(shù)量的事件控制塊、信號量控制塊等操作系統(tǒng)組件所需內(nèi)存的條件下的,完全滿足一個小型系統(tǒng)所需。
說了半天,其實也只講了操作系統(tǒng)對內(nèi)存需求的冰山一角,OS下編程,對內(nèi)存需求的影響最大的,當(dāng)屬OS的多線程并發(fā)特性,這使得我們要為每一個線程分配獨立的棧。下面我們定性分析一下棧獨立化帶來的內(nèi)存需求變化。棧是用來保存函數(shù)參數(shù)和局部變量的,可以說,有函數(shù)調(diào)用,就有局部變量。在單線程環(huán)境下,應(yīng)用程序需要的棧,幾乎就是main函數(shù)需要的棧,而在多線程環(huán)境下,每個線程的棧是獨立的,分別等于該線程的線程執(zhí)行函數(shù)所需要的棧,而系統(tǒng)總的棧需求,就是所有線程的棧需求之和。
假設(shè)有一不使用OS的應(yīng)用程序,main函數(shù)如下:
void main(void){ while(1) { func1(); //本函數(shù)需要10K棧 func2(); //本函數(shù)需要5K棧 func3(); //本函數(shù)需要9K棧 func4(); //本函數(shù)需要8K棧 func5(); //本函數(shù)需要9K棧 }}
在超級循環(huán)中,分別調(diào)用了func1~func5這5個函數(shù),他們的棧需求分別是10K、5K、9K、8K、9K。調(diào)用func1時,系統(tǒng)分配10K的ram作為棧,func1函數(shù)返回,這10K空間將被釋放,并且再次分配給func2使用,所以,整個程序的棧需求,就是這5個函數(shù)中需要棧最多的那個函數(shù)需要的??臻g:10K。
如果要把這個程序移植到OS下,最簡單的方法就是創(chuàng)建5個線程來調(diào)用func1~5這5個函數(shù),這5個線程需要的棧分別是10K、5K、9K、8K、9K,而這5個棧是獨立的,不能共用,程序總共需要的棧空間是(10+5+9+8+9)=41K,線程棧一般是從堆中動態(tài)分配的,考慮到動態(tài)分配本身的開銷,硬件須準備50K以上的內(nèi)存用于程序的運行棧。一下子增長到5倍,沒想到吧。
可見,上操作系統(tǒng),雖然操作系統(tǒng)本身不需要很大內(nèi)存,但會極度增加應(yīng)用程序的內(nèi)存需求。做項目時,一是不要盲目上OS,要根據(jù)需求綜合考慮,二是設(shè)計硬件系統(tǒng)時,應(yīng)該充分考慮到內(nèi)存方面的需求,配置充足的內(nèi)存。
3、人
任何產(chǎn)品都是由人開發(fā)的,所以,討論嵌入式產(chǎn)品開發(fā)的任何話題,都不能離開人的因素,科技以人為本嘛!從裸奔到操作系統(tǒng),那么程序員,也將由編寫裸奔程序轉(zhuǎn)為在操作系統(tǒng)下編程。這些迅速、大量增加的程序員,他們可能習(xí)慣了在裸奔環(huán)境下編程,他們可能是化工、建筑、地質(zhì)等不同行業(yè)的專家,他們也許已經(jīng)上了年紀,沒有太多的精力學(xué)習(xí)多線程編程等知識。然而,涉及到專業(yè)的程序,仍然離不開他們,如何從技術(shù)上降低他們的入門門檻,是一個亟需考慮的問題。但是,普通的操作系統(tǒng)下,你不掌握線程控制技術(shù),就無法編寫正確的程序。djyos允許你按事件編程,沒有任何跟線程相關(guān)的api函數(shù),無需程序員掌握線程技術(shù),客觀上降低了裸奔到OS編程的轉(zhuǎn)換技術(shù)門檻。
-
嵌入式
+關(guān)注
關(guān)注
5086文章
19141瀏覽量
305955 -
RTOS
+關(guān)注
關(guān)注
22文章
815瀏覽量
119706
原文標題:裸奔和RTOS下的嵌入式開發(fā),有啥不同?
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論