當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀] 引言:隨著各種應用電子系統(tǒng)的復雜化和系統(tǒng)實時性需求的提高,并伴隨應用軟件朝著系統(tǒng)化方向發(fā)展的加速,在16位/32位單片機中廣泛使用了嵌入式實時操作系統(tǒng)。然而實際使用

 引言:

隨著各種應用電子系統(tǒng)的復雜化和系統(tǒng)實時性需求的提高,并伴隨應用軟件朝著系統(tǒng)化方向發(fā)展的加速,在16位/32位單片機中廣泛使用了嵌入式實時操作系統(tǒng)。然而實際使用中卻存在著大量8位單片機,從經濟性考慮,對某些應用場合,在8位MCU上使用操作系統(tǒng)是可行的。從學習操作系統(tǒng)角度,uC/OS-II for 51即簡單又全面,學習成本低廉,值得推廣。

結語:μC/OS-II具有免費、簡單、可靠性高、實時性好等優(yōu)點,但也有缺乏便利開發(fā)環(huán)境等缺點,尤其不像商用嵌入式系統(tǒng)那樣得到廣泛使用和持續(xù)的研究更新。但開放性又使得開發(fā)人員可以自行裁減和添加所需的功能,在許多應用領域發(fā)揮著獨特的作用。當然,是否在單片機系統(tǒng)中嵌入μC/OS-II應視所開發(fā)的項目而定,對于一些簡單的、低成本的項目來說,就沒必要使用嵌入式操作系統(tǒng)了。

uC/OS-II原理:

uCOSII包括任務調度、時間管理、內存管理、資源管理(信號量、郵箱、消息隊列)四大部分,沒有文件系統(tǒng)、網絡接口、輸入輸出界面。它的移植只與4個文件相關:匯編文件(OS_CPU_A.ASM)、處理器相關C文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。有64個優(yōu)先級,系統(tǒng)占用8個,用戶可創(chuàng)建56個任務,不支持時間片輪轉。它的基本思路就是 “近似地每時每刻總是讓優(yōu)先級最高的就緒任務處于運行狀態(tài)” 。為了保證這一點,它在調用系統(tǒng)API函數(shù)、中斷結束、定時中斷結束時總是執(zhí)行調度算法。原作者通過事先計算好數(shù)據(jù),簡化了運算量,通過精心設計就緒表結構,使得延時可預知。任務的切換是通過模擬一次中斷實現(xiàn)的。

uCOSII工作核心原理是:近似地讓最高優(yōu)先級的就緒任務處于運行狀態(tài)。

操作系統(tǒng)將在下面情況中進行任務調度:調用API函數(shù)(用戶主動調用),中斷(系統(tǒng)占用的時間片中斷OsTimeTick(),用戶使用的中斷)。

調度算法書上講得很清楚,我主要講一下整體思路。

(1)在調用API函數(shù)時,有可能引起阻塞,如果系統(tǒng)API函數(shù)察覺到運行條件不滿足,需要切換就調用OSSched()調度函數(shù),這個過程是系統(tǒng)自動完成的,用戶沒有參與。OSSched()判斷是否切換,如果需要切換,則此函數(shù)調用OS_TASK_SW()。這個函數(shù)模擬一次中斷(在51里沒有軟中斷,我用子程序調用模擬,效果相同),好象程序被中斷打斷了,其實是OS故意制造的假象,目的是為了任務切換。既然是中斷,那么返回地址(即緊鄰OS_TASK_SW()的下一條匯編指令的PC地址)就被自動壓入堆棧,接著在中斷程序里保存CPU寄存器(PUSHALL)……。堆棧結構不是任意的,而是嚴格按照uCOSII規(guī)范處理。OS每次切換都會保存和恢復全部現(xiàn)場信息(POPALL),然后用RETI回到任務斷點繼續(xù)執(zhí)行。這個斷點就是OSSched()函數(shù)里的緊鄰OS_TASK_SW()的下一條匯編指令的PC地址。切換的整個過程就是,用戶任務程序調用系統(tǒng)API函數(shù),API調用OSSched(),OSSched()調用軟中斷OS_TASK_SW()即OSCtxSw,返回地址(PC值)壓棧,進入OSCtxSw中斷處理子程序內部。反之,切換程序調用RETI返回緊鄰OS_TASK_SW()的下一條匯編指令的PC地址,進而返回OSSched()下一句,再返回API下一句,即用戶程序斷點。因此,如果任務從運行到就緒再到運行,它是從調度前的斷點處運行。

(2)中斷會引發(fā)條件變化,在退出前必須進行任務調度。uCOSII要求中斷的堆棧結構符合規(guī)范,以便正確協(xié)調中斷退出和任務切換。前面已經說到任務切換實際是模擬一次中斷事件,而在真正的中斷里省去了模擬(本身就是中斷嘛)。只要規(guī)定中斷堆棧結構和uCOSII模擬的堆棧結構一樣,就能保證在中斷里進行正確的切換。任務切換發(fā)生在中斷退出前,此時還沒有返回中斷斷點。仔細觀察中斷程序和切換程序最后兩句,它們是一模一樣的,POPALL+RETI。即要么直接從中斷程序退出,返回斷點;要么先保存現(xiàn)場到TCB,等到恢復現(xiàn)場時再從切換函數(shù)返回原來的中斷斷點(由于中斷和切換函數(shù)遵循共同的堆棧結構,所以退出操作相同,效果也相同)。用戶編寫的中斷子程序必須按照uCOSII規(guī)范書寫。任務調度發(fā)生在中斷退出前,是非常及時的,不會等到下一時間片才處理。OSIntCtxSw()函數(shù)對堆棧指針做了簡單調整,以保證所有掛起任務的棧結構看起來是一樣的。

(3)在uCOSII里,任務必須寫成兩種形式之一(《uCOSII中文版》p99頁)。在有些RTOS開發(fā)環(huán)境里沒有要求顯式調用OSTaskDel(),這是因為開發(fā)環(huán)境自動做了處理,實際原理都是一樣的。uCOSII的開發(fā)依賴于編譯器,目前沒有專用開發(fā)環(huán)境,所以出現(xiàn)這些不便之處是可以理解的。

移植過程:

(1)拷貝書后附贈光盤sourcecode目錄下的內容到C:YY下,刪除不必要的文件和EX1L.C,只剩下p187(《uCOSII》)上列出的文件。

(2)改寫最簡單的OS_CPU.H

數(shù)據(jù)類型的設定見C51.PDF第176頁。注意BOOLEAN要定義成unsigned char 類型,因為bit類型為C51特有,不能用在結構體里。

EA=0關中斷;EA=1開中斷。這樣定義即減少了程序行數(shù),又避免了退出臨界區(qū)后關中斷造成的死機。

MCS-51堆棧從下往上增長(1=向下,0=向上),OS_STK_GROWTH定義為0#define OS_TASK_SW() OSCtxSw() 因為MCS-51沒有軟中斷指令,所以用程序調用代替。兩者的堆棧格式相同,RETI指令復位中斷系統(tǒng),RET則沒有。實踐表明,對于MCS-51,用子程序調用入棧,用中斷返回指令RETI出棧是沒有問題的,反之中斷入棧RET出棧則不行。總之,對于入棧,子程序調用與中斷調用效果是一樣的,可以混用。在沒有中斷發(fā)生的情況下復位中斷系統(tǒng)也不會影響系統(tǒng)正常運行。詳見《uC/OS-II》第八章193頁第12行

(3)改寫OS_CPU_C.C

我設計的堆棧結構如下圖所示:

TCB結構體中OSTCBStkPtr總是指向用戶堆棧最低地址,該地址空間內存放用戶堆棧長度,其上空間存放系統(tǒng)堆棧映像,即:用戶堆棧空間大小=系統(tǒng)堆棧空間大小+1。

SP總是先加1再存數(shù)據(jù),因此,SP初始時指向系統(tǒng)堆棧起始地址(OSStack)減1處(OSStkStart)。很明顯系統(tǒng)堆棧存儲空間大小=SP-OSStkStart。

任務切換時,先保存當前任務堆棧內容。方法是:用SP-OSStkStart得出保存字節(jié)數(shù),將其寫入用戶堆棧最低地址內,以用戶堆棧最低地址為起址,以OSStkStart為系統(tǒng)堆棧起址,由系統(tǒng)棧向用戶??截悢?shù)據(jù),循環(huán)SP-OSStkStart次,每次拷貝前先將各自棧指針增1。[!--empirenews.page--]

其次,恢復最高優(yōu)先級任務系統(tǒng)堆棧。方法是:獲得最高優(yōu)先級任務用戶堆棧最低地址,從中取出“長度”,以最高優(yōu)先級任務用戶堆棧最低地址為起址,以OSStkStart為系統(tǒng)堆棧起址,由用戶棧向系統(tǒng)??截悢?shù)據(jù),循環(huán)“長度”數(shù)值指示的次數(shù),每次拷貝前先將各自棧指針增1。

用戶堆棧初始化時從下向上依次保存:用戶堆棧長度(15),PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。不保存SP,任務切換時根據(jù)用戶堆棧長度計算得出。

OSTaskStkInit函數(shù)總是返回用戶棧最低地址。

操作系統(tǒng)tick時鐘我使用了51單片機的T0定時器,它的初始化代碼用C寫在了本文件中。

最后還有幾點必須注意的事項。本來原則上我們不用修改與處理器無關的代碼,但是由于KEIL編譯器的特殊性,這些代碼仍要多處改動。因為KEIL缺省情況下編譯的代碼不可重入,而多任務系統(tǒng)要求并發(fā)操作導致重入,所以要在每個C函數(shù)及其聲明后標注reentrant關鍵字。另外,“pdata”、“data”在uCOS中用做一些函數(shù)的形參,但它同時又是KEIL的關鍵字,會導致編譯錯誤,我通過把“pdata”改成“ppdata”,“data”改成“ddata”解決了此問題。OSTCBCur、OSTCBHighRdy、OSRunning、OSPrioCur、OSPrioHighRdy這幾個變量在匯編程序中用到了,為了使用Ri訪問而不用DPTR,應該用KEIL擴展關鍵字IDATA將它們定義在內部RAM中。

(4)重寫OS_CPU_A.ASM

A51宏匯編的大致結構如下:

NAME 模塊名 ;與文件名無關

定義重定位段 必須按照C51格式定義,匯編遵守C51規(guī)范。段名格式為:?PR?函數(shù)名?模塊名

聲明引用全局變量和外部子程序 注意關鍵字為“EXTRN”沒有‘E’

全局變量名直接引用

無參數(shù)/無寄存器參數(shù)函數(shù) FUNC

帶寄存器參數(shù)函數(shù) _FUNC

重入函數(shù) _?FUNC

分配堆棧空間

只關心大小,堆棧起點由keil決定,通過標號可以獲得keil分配的SP起點。切莫自己分配堆棧起點,只要用DS通知KEIL預留堆??臻g即可。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉