• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于工控單片機的嵌入式操作系統(tǒng)核心的設(shè)計

      2010-09-03 08:25:22黃彩虹何明華
      關(guān)鍵詞:信號量休眠狀態(tài)堆棧

      陳 康, 黃彩虹, 何明華

      (1.福州大學(xué) 自動化與電氣工程學(xué)院,福建 福州 350007;2.華僑大學(xué) 信息科學(xué)與工程學(xué)院,福建 廈門 361021)

      嵌入式實時操作系統(tǒng)(real-time operating system,簡寫為RTOS)具有比較好的擴展性,且通過任務(wù)這個概念把原有的應(yīng)用程序分割成若干部分。由于采用可剝奪型的內(nèi)核,與前后臺系統(tǒng)相比,實時性得到了更好的保證,所以 RTOS在嵌入式系統(tǒng)中得到了廣泛的應(yīng)用[1]。但現(xiàn)有的幾個RTOS(Linux,VxWorks,uC/OS-II)代碼量比較大,占用較多的內(nèi)存資源,對CPU硬件要求較高,目前在工業(yè)控制領(lǐng)域中廣泛應(yīng)用的CPU如8051系列由于其內(nèi)存較小(片內(nèi)存儲器僅128個字節(jié)),速度較慢(外接晶振為12 M),無法使用這些操作系統(tǒng)。為提高工控軟件的開發(fā)效率,考慮用C語言為其設(shè)計一種RTOS。

      1 實 現(xiàn)

      1.1 搶先式算法

      由于目前RTOS常用算法有搶先式與非搶先式2種。考慮到自動控制領(lǐng)域?qū)崟r性要求較高,使用搶先式算法,它的主要特點是處于就緒態(tài)的最高優(yōu)先級任務(wù)始終運行并占用著CPU,優(yōu)點在于能夠迅速對外部事件做出響應(yīng)。在這個內(nèi)核里,可以把所有的任務(wù)分為掛起、就緒、運行、休眠、被中斷態(tài)5種狀態(tài),這些狀態(tài)可以進行相互間的轉(zhuǎn)換,如圖1所示。某一時刻任何任務(wù)都處于5種狀態(tài)之一,操作系統(tǒng)就是要根據(jù)設(shè)計者的需要實現(xiàn)這些狀態(tài)之間的轉(zhuǎn)化,并查找就緒任務(wù)中優(yōu)先級最高的使其迅速進入運行狀態(tài)。

      圖1 任務(wù)狀態(tài)機

      由于單片機內(nèi)存容量較小,只有128字節(jié),為盡可能地節(jié)省內(nèi)存,在這個操作系統(tǒng)中使用函數(shù)數(shù)組定義作為基本的數(shù)據(jù)結(jié)構(gòu)[2],其代碼為:

      Void(*processTable[TOTALTASK])()。

      這個數(shù)據(jù)結(jié)構(gòu)里定義了各個任務(wù)的函數(shù)入口地址,主要是為了減少內(nèi)存占用,精簡代碼量,還可通過各個任務(wù)在數(shù)組中的索引來確定它的優(yōu)先級,索引值越大,優(yōu)先級越高[3]。另外,為區(qū)分任務(wù)的不同狀態(tài),建立了2個狀態(tài)表。

      (1)休眠狀態(tài)表。用若干個字節(jié)來表示(取決于任務(wù)數(shù)),每位表示一個任務(wù),0表示休眠狀態(tài),1表示非休眠狀態(tài)(包括就緒和掛起態(tài))。

      (2)掛起任務(wù)狀態(tài)表。用若干個字節(jié)來表示,每位表示一個任務(wù),休眠狀態(tài)表的該位為1的情況下,掛起任務(wù)狀態(tài)表中的1表示就緒狀態(tài),0表示掛起狀態(tài)。可通過狀態(tài)表中任務(wù)所在字節(jié)的位置來確定其優(yōu)先級,位數(shù)越高的,優(yōu)先級越高。

      實時操作系統(tǒng)運行時需要找到優(yōu)先級最高的就緒態(tài)任務(wù)并讓其運行,這就是任務(wù)調(diào)度,可以通過休眠狀態(tài)表與掛起狀態(tài)表相與得到任務(wù)就緒狀態(tài)表,在此表中1為就緒態(tài),0為非就緒態(tài)。位數(shù)越高的任務(wù)代表的優(yōu)先級越高(例如,bit 7所代表任務(wù)的優(yōu)先級高于bit 6),可以通過函數(shù)task-Sched()查找就緒狀態(tài)表中位數(shù)最高的1以確定下一個進入運行的任務(wù),其實現(xiàn)如圖2所示??驁D中的變量NextRunningTask做為全局變量代表下一個即將運行的任務(wù)。此外還需按照圖1根據(jù)實際需要對相關(guān)的任務(wù)進行切換。就是通過程序把休眠狀態(tài)表或掛起狀態(tài)表相應(yīng)的位設(shè)為1或0來實現(xiàn)狀態(tài)的轉(zhuǎn)換,以setReady(int i)為例畫出框圖說明如何將掛起態(tài)的任務(wù)轉(zhuǎn)換為就緒態(tài),i代表想要變成就緒態(tài)的任務(wù)號,如圖3所示。此外還有些狀態(tài)轉(zhuǎn)換的函數(shù)與此類似,8051有2個外部中斷,在中斷中可以調(diào)用這些程序來改變?nèi)蝿?wù)的狀態(tài),由于篇幅的原因不具體介紹。

      1.2 上下文切換方法

      運行的任務(wù)切換為其它狀態(tài)或其它狀態(tài)切換成運行態(tài),不僅僅需要狀態(tài)表的變換,還需要堆棧進行上下文切換。所謂的上下文切換是指將當(dāng)前任務(wù)的現(xiàn)場數(shù)據(jù)推入堆棧,將要運行任務(wù)的現(xiàn)場數(shù)據(jù)從堆棧里恢復(fù)。根據(jù)不同CPU以及片內(nèi)存儲器大小的差異用不同的方法建立堆棧,一種是為每個任務(wù)建立大小相同的任務(wù)堆棧,其容量按現(xiàn)場數(shù)據(jù)的最大值計算。另一種是每個任務(wù)的堆棧大小根據(jù)實際需要來確定。這2種方法都需要把每個任務(wù)的棧底或棧頂?shù)奈恢帽4嬖诙褩?shù)組stackPos中。針對2種建立堆棧的方法,其上下文切換的方法也是不同的。

      方法1是推入當(dāng)前任務(wù)的現(xiàn)場數(shù)據(jù)后,根據(jù)棧底位置+(要運行的任務(wù)號*每個任務(wù)堆棧占用的字節(jié)數(shù)),直接找到將要運行任務(wù)的堆棧地址,將堆棧指針指向該處即可推出數(shù)據(jù)。該種方法的優(yōu)點是不需要移動其它任務(wù)的現(xiàn)場數(shù)據(jù),其任務(wù)切換較快,缺點也很明顯,內(nèi)存浪費較大,所以它比較適合TI的DSP2407等大內(nèi)存系統(tǒng)。

      圖2 任務(wù)調(diào)度

      圖3 setReady框圖

      方法2則將多余的內(nèi)存保存在當(dāng)前任務(wù)堆棧中,推入現(xiàn)場數(shù)據(jù)后,移動當(dāng)前任務(wù)與將要運行任務(wù)之間所有的現(xiàn)場數(shù)據(jù),使堆棧中的多余空間保存在將要運行的任務(wù)上,將堆棧指針指向?qū)⒁\行任務(wù)的堆棧[4]。具體實現(xiàn)如圖 4、圖5所示。由于現(xiàn)場數(shù)據(jù)與CPU的型號有很大的關(guān)系,所以這一段需要用匯編語言編寫[5]。使用方法2時內(nèi)存利用率較高,但是由于需要移動多個任務(wù)的現(xiàn)場數(shù)據(jù),切換速度較慢,比較適合8051等小內(nèi)存系統(tǒng)。這2種方法在系統(tǒng)中是通過編譯開關(guān)來實現(xiàn)選擇編譯的。

      圖4 任務(wù)堆棧切換方法1

      圖5 任務(wù)堆棧切換方法2

      1.3 優(yōu)先級反轉(zhuǎn)問題

      對于共享設(shè)備與共享資源,信號量的操作是不可避免的。在進入共享資源前,任務(wù)必須獲取一個信號量;一旦共享設(shè)備使用完成,那么該設(shè)備必須釋放信號量[6]。其它想進入的任務(wù)必須等待,直到某個任務(wù)釋放信號量。在信號量使用時經(jīng)常會遇到優(yōu)先級反轉(zhuǎn)的問題。所謂優(yōu)先級反轉(zhuǎn)是指高優(yōu)先級任務(wù)需要等待低優(yōu)先級任務(wù)釋放資源,而低優(yōu)先級任務(wù)又正在等待中等優(yōu)先級任務(wù)的現(xiàn)象叫做優(yōu)先級反轉(zhuǎn)。

      舉個例子,任務(wù)1優(yōu)先級高于任務(wù)2,任務(wù)2優(yōu)先級高于任務(wù)3。任務(wù)1和任務(wù)2處于掛起狀態(tài),等待某一事件的發(fā)生,任務(wù)3正在運行。此時,任務(wù)3要使用其共享資源。使用共享資源之前,首先必須得到該資源的信號量(Semaphore)。任務(wù)3得到了該信號量,并開始使用該共享資源。由于任務(wù)1優(yōu)先級高,它等待的事件到來之后剝奪了任務(wù)3的CPU使用權(quán),任務(wù)1開始運行。運行過程中任務(wù)1也要使用任務(wù)3正在使用著的資源,由于該資源的信號量還被任務(wù)3占用著,任務(wù)1只能進入掛起狀態(tài),等待任務(wù)3釋放該信號量,任務(wù)3得以繼續(xù)運行。

      由于任務(wù)2的優(yōu)先級高于任務(wù)3,當(dāng)任務(wù)2等待的事件發(fā)生后,任務(wù)2剝奪了任務(wù)3的CPU的使用權(quán)并開始運行,處理它該處理的事件,直到處理完之后將CPU控制權(quán)還給任務(wù)3。

      任務(wù)3接著運行,直到釋放該共享資源的信號量。直到此時,實時內(nèi)核知道有個高優(yōu)先級的任務(wù)在等待這個信號量,內(nèi)核做任務(wù)切換,使任務(wù)1得到該信號量并接著運行,在這種情況下,任務(wù)1優(yōu)先級實際降到了任務(wù)3的優(yōu)先級水平。因為任務(wù)1要等,等到任務(wù)3釋放占有的共享資源。由于任務(wù)2剝奪任務(wù)3的CPU使用權(quán),使任務(wù)1的狀況更加惡化,任務(wù)2使任務(wù)1增加了額外的延遲時間。任務(wù)1和任務(wù)2的優(yōu)先級發(fā)生了反轉(zhuǎn)[1]。

      為解決此問題,可采用優(yōu)先級繼承算法來實現(xiàn),就是將任務(wù)3的優(yōu)先級提高到任務(wù)1來。由于是在單片機上運行這個操作系統(tǒng),為減少代碼量及其內(nèi)存,通過修改備份后的就緒狀態(tài)表與堆棧位置數(shù)組stackPos來實現(xiàn),就是當(dāng)一個任務(wù)因為信號量進入掛起狀態(tài)時,檢測是否有低優(yōu)先級的任務(wù)正在占用該信號量,如果有修改堆棧位置數(shù)組中的高優(yōu)先級任務(wù)的堆棧位置指向,使其指向占用該資源低優(yōu)先級任務(wù)的堆棧位置,實現(xiàn)優(yōu)先級繼承,在任務(wù)運行完后通過信號量釋放來恢復(fù)原有的堆棧位置數(shù)組,恢復(fù)原有的優(yōu)先級,重新設(shè)定休眠狀態(tài)表與就緒狀態(tài)表,具體如圖6、圖7所示,該種方法只需占用極少的內(nèi)存,很適合在8051這種小內(nèi)存的系統(tǒng)上運行。另外在該操作系統(tǒng)中各個任務(wù)間的通信可通過信息隊列或郵箱來實現(xiàn),這與信號量的實現(xiàn)相似。需要指出的是上述介紹的都是操作系統(tǒng)的臨界代碼,進入臨界代碼需要關(guān)中斷,完成臨界代碼后再打開中斷,只有這樣才能保證系統(tǒng)的正常運行[7,8]。

      圖6 帶有優(yōu)先級繼承的信號量掛起

      圖7 信號量釋放

      1.4 可重入函數(shù)

      搶先式內(nèi)核需要可重入的函數(shù),所以在編寫前,還需要了解編譯環(huán)境是否易于產(chǎn)生可重入函數(shù)。如果采用8051的C語言編譯器KEil C作為編譯環(huán)境,一般情況下會產(chǎn)生不可重入函數(shù),因為它把局部變量也放在系統(tǒng)內(nèi)存的固定位置中,就相當(dāng)于全局變量一樣,在這種情況下必須采取一些方法來產(chǎn)生一個可重入函數(shù),例如減少函數(shù)自變量個數(shù),使得KEil C將每個自變量放入寄存器,而不是放在內(nèi)存中來產(chǎn)生可重入函數(shù)。

      2 測試與結(jié)果

      在8051系列單片機上使用該操作系統(tǒng)對房間溫度濕度控制系統(tǒng)編寫程序。該控制系統(tǒng)通過溫度與濕度傳感器檢測房間中的實際溫度,在出現(xiàn)偏差時通過空調(diào)與加濕機來保持房間溫度濕度恒定,并顯示溫度與濕度的實際值。在此系統(tǒng)中將溫度顯示、濕度顯示、溫度控制與濕度控制分別作為控制任務(wù),按照優(yōu)先級從高到低寫入到數(shù)組函數(shù)中。由于其中2個任務(wù)共用一個顯示,所以必須使用信號量函數(shù)。通過在上下文切換與信號量函數(shù)中設(shè)置斷點,觀察掛起狀態(tài)表與將要運行任務(wù)等變量,確定各個任務(wù),可根據(jù)優(yōu)先級的高低自動進行切換,堆棧中的現(xiàn)場數(shù)據(jù)推入與推出正確,溫度與濕度可用7段代碼依次顯示。另外為測試優(yōu)先級反轉(zhuǎn),修改了程序,將濕度顯示與溫度控制對調(diào)。在濕度顯示時觸發(fā)溫度控制使其運行,通過在信號量等待函數(shù)中設(shè)置斷點,這時觀察到優(yōu)先級發(fā)生轉(zhuǎn)換,證明了優(yōu)先級繼承算法使任務(wù)的實時響應(yīng)獲得了極大的提高。由于該操作系統(tǒng)大小不到3 k字節(jié),對硬件的要求極低,占用的系統(tǒng)資源較少,使該控制系統(tǒng)能夠順利運行,最關(guān)鍵的是由于在設(shè)計過程中使用RTOS,設(shè)計調(diào)試時間由原來的 1個月縮短為1周,提高了設(shè)計效率。

      [1]Labrosse J J.嵌入式實時操作系統(tǒng)μ C/OS[M].邵貝貝,譯.北京:北京航天航空大學(xué)出版社,2003:120-125.

      [2]譚浩強.C程序設(shè)計[M].第2版.北京:清華大學(xué)出版社,2003:102-105.

      [3]馬忠梅,籍順心,張 凱,等.單片機的C語言應(yīng)用程序設(shè)計[M].第 3版.北京:北京航空航天大學(xué)出版社,2003:45-47.

      [4]彭良清.μ C/OS-II任務(wù)堆棧處理的一種改進方法[J].單片機與嵌入式系統(tǒng)應(yīng)用,2008,(5):115-120.

      [5]卡馬爾.嵌入式體系結(jié)構(gòu)編程與設(shè)計[M].北京:清華大學(xué)出版社,2005:89-98.

      [6]Allworth S T.Introduction to real-time software desig n[M].New York :Springer-Verlag,1981:31-32.

      [7]Douglas C.Operating-system design:the XINU approach[M].Englewood Cliffs,New Jersey:Prentice-Hall,1984:6-9.

      [8]Wood M,Barrett T.A real-time primer[J].Embedded Systems Prog ramming,1990,3(2):20-28.

      猜你喜歡
      信號量休眠狀態(tài)堆棧
      基于STM32的mbedOS信號量調(diào)度機制剖析
      靶向治療下乳腺癌干細胞發(fā)生發(fā)展動力學(xué)分析
      水稻種子休眠調(diào)控與破除技術(shù)的發(fā)展
      癌細胞從“休眠”到“蘇醒”重大謎團獲解
      Nucleus PLUS操作系統(tǒng)信號量機制的研究與測試
      嵌入式軟件堆棧溢出的動態(tài)檢測方案設(shè)計*
      基于堆棧自編碼降維的武器裝備體系效能預(yù)測
      基于分離樹的能量有效數(shù)據(jù)轉(zhuǎn)發(fā)機制*
      μC/OS- -III對信號量的改進
      Linux操作系統(tǒng)信號量機制的實時化改造
      昌平区| 南华县| 正安县| 长兴县| 潞西市| 青州市| 闽清县| 桦川县| 延寿县| 南岸区| 讷河市| 兰西县| 京山县| 工布江达县| 磴口县| 靖边县| 区。| 遂昌县| 黎平县| 若羌县| 米脂县| 阿拉尔市| 湘乡市| 佛坪县| 射洪县| 余庆县| 潼南县| 寻乌县| 兴业县| 潍坊市| 南江县| 周宁县| 新巴尔虎右旗| 沭阳县| 商水县| 松潘县| 乌鲁木齐县| 宜川县| 乌审旗| 龙江县| 墨玉县|