當前位置:首頁 > 單片機 > 單片機
[導讀]摘要:針對在51單片機上移植實時操作系統(tǒng)μC/OS-II的目的,以μC/OS-II工作原理為基礎(chǔ),結(jié)合51單片機堆棧空間少的情況,采用改變堆棧指針到不同任務(wù)寄存器組的方法,通過改變堆棧指針的實驗,得出在堆??臻g較

摘要:針對在51單片機移植實時操作系統(tǒng)μC/OS-II的目的,以μC/OS-II工作原理為基礎(chǔ),結(jié)合51單片機堆??臻g少的情況,采用改變堆棧指針到不同任務(wù)寄存器組的方法,通過改變堆棧指針的實驗,得出在堆棧空間較少的情況下,也能夠?qū)崿F(xiàn)μC/OS-II在51單片機上的運行的結(jié)論。
關(guān)鍵詞:μC/OS;單片機;實時操作系統(tǒng);堆棧

    μC/OS-II是一種公開源代碼、結(jié)構(gòu)小巧、具有可剝奪實時內(nèi)核的嵌入式開發(fā)系統(tǒng),代碼簡短、條理清晰、實時性及安全性能很高,絕大部分代碼用C編寫,現(xiàn)已被移植到多種處理器的構(gòu)架中。隨著51單片機片內(nèi)資源的日益豐富,在51單片機上移植μC/OS-II已成為可能,植入系統(tǒng)后,由系統(tǒng)來管理軟件與硬件資源,簡化應(yīng)用程序的設(shè)計,并且使應(yīng)用系統(tǒng)功能更加完善。因此在51單片機上移植μC/OS-II具有十分重要的意義。

1 μC/OS實時操作系統(tǒng)概述
     μC/OS-II實時操作系統(tǒng)是一種可移植、可固化、可裁剪即可剝奪型的多任務(wù)實時內(nèi)核,適用于各種微處理器和微控制器。μC/OS-II主要包括任務(wù)調(diào)度、時間管理、內(nèi)存管理、事件管理(信號量、郵箱、消息隊列)4大部分。它的移植與4個文件相關(guān):匯編文件(OS_CPU_A.A SM)、處理器相關(guān)C文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。有64個優(yōu)先級,系統(tǒng)占用8個,用戶可創(chuàng)建56任務(wù),不支持時間片輪轉(zhuǎn)。
    它的基本思路就是“近似地每時每刻總是讓優(yōu)先級最高的就緒任務(wù)處于運行狀態(tài)”。為了保證這一點,它在調(diào)用系統(tǒng)函數(shù)、中斷結(jié)束、定時中斷結(jié)束時總是執(zhí)行調(diào)度算法。原作者通過事先計算好數(shù)據(jù),簡化了運算量,通過精心設(shè)計就緒表結(jié)構(gòu),使得延時可預(yù)知。任務(wù)的切換是通過模擬一次中斷實現(xiàn)的。

2 任務(wù)調(diào)度的實現(xiàn)原理
    任務(wù)調(diào)度是μC/OS-II的重要部分,和具體的微處理器關(guān)系緊密。必須移植的5個函數(shù)有4個都和任務(wù)有關(guān)。任務(wù)調(diào)度就是保存當前任務(wù)的寄存器和PC指針(即當前任務(wù)的斷點),然后把將要執(zhí)行的任務(wù)的寄存器值返回給寄存器并把PC指向?qū)⒁獔?zhí)行任務(wù)的斷點。這些的實現(xiàn)要借助于堆棧和中斷,為了簡便起見,先看函數(shù)調(diào)用時堆棧的使用情況。在函數(shù)調(diào)用時,堆棧的一個重要功能就是保存被調(diào)函數(shù)的斷點地址。若有4個函數(shù),F(xiàn)un1調(diào)用Fun2,F(xiàn)un2調(diào)用Fun3,F(xiàn)un3調(diào)用Fun4,F(xiàn)un4為葉子程序(無子程序調(diào)用)。
   
    假設(shè)現(xiàn)在從Fun1一直運行到Fun4,此時堆棧結(jié)構(gòu)如圖1所示,中間的ADD_A到ADD_D為堆棧中的數(shù)據(jù),左邊的SP到SP-7為堆棧指針,右邊的Fun1到Fun4為對應(yīng)的調(diào)用函數(shù)。運行Fun4時,此時SP與SP-1所存的值為ADD_D,而ADD_D為Fun3中子函數(shù)Fun4的下一行的地址,即Fun3中3-2行的地址,以此類推,ADD_C為2-2行地址,ADD_B 圖1函數(shù)運行及堆棧結(jié)構(gòu)圖為1-2行地址。


    當函數(shù)A調(diào)用函數(shù)B時,進入函數(shù)B時就會把函數(shù)A的斷點地址壓棧,而當函數(shù)B運行結(jié)束時則把堆棧中函數(shù)A的斷點地址彈出到PC指針,程序接著從函數(shù)A的斷點開始運行。如果在函數(shù)B中更改SP及SP-1中的數(shù)據(jù),則函數(shù)B運行結(jié)束時就不會再返回函數(shù)A中,而返回到SP及SP-1更改后的數(shù)據(jù)所代表的地址。
    以上是函數(shù)調(diào)用時的基本情況,如果是中斷則堆棧不僅保存斷點地址還會自動保存寄存器的值。任務(wù)調(diào)度就是靠中斷來實現(xiàn),中斷中所保存的斷點地址就是任務(wù)的斷點地址,當本任務(wù)要再次執(zhí)行時就把斷點地址賦給PC就可以接著任務(wù)被中斷時地址順序執(zhí)行。

3 頭文件移植
    與移植相關(guān)的4個文件中有2個頭文件,這2個頭文件的移植比較簡單,可以參考其它的移植程序。其中OS_CPU.H中主要是數(shù)據(jù)類型的定義、堆棧生長方向的定義、開關(guān)中斷的定義以及函數(shù)級任務(wù)切換的宏定義。OS_CFG.H中主要是任務(wù)數(shù)、優(yōu)先級數(shù)、事件數(shù)、每秒中斷節(jié)拍數(shù)以及各種系統(tǒng)函數(shù)的使能定義。

4 匯編與C文件的移植
    在要移植的匯編與C的兩個文件中有14個函數(shù),其中9個是接口函數(shù),可根據(jù)實際需要來決定,有5個是必須寫的。這5個函數(shù)分別是:OS_CPU_C.C文件中的OSTaskStkInit()和OS_CPU_A.ASM文件中的OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()與OSTickISR()。下面就這5個函數(shù)來做具體分析。
4.1 任務(wù)堆棧初始化函數(shù)OSTaskStkInit()
    此函數(shù)是在任務(wù)創(chuàng)建函數(shù)OSTaskCreat()或OSTaskCreatExt()中調(diào)用的。因為系統(tǒng)為每個任務(wù)申請了一個數(shù)組作為棧,當一個任務(wù)運行時,就把堆棧指針指向本任務(wù)的棧,任務(wù)堆棧初始化函數(shù)就是在任務(wù)創(chuàng)建時將要創(chuàng)建任務(wù)的堆棧進行初始化。但C51的堆棧指針SP是8位的,只能在片內(nèi)RAM的256個字節(jié)內(nèi)尋址。因其尋址空間有限且SP唯一,不能像DSP或ARM那樣為每一段程序或每一種模式定義堆棧,需小心管理堆??臻g。為了適應(yīng)上述情況,需要換一種思路,不是讓SP去指向各任務(wù)堆棧空間,而是把各任務(wù)堆棧空間的內(nèi)容復制到系統(tǒng)棧中。至于堆棧數(shù)組空間要有多大以及堆棧數(shù)組空間里放些什么內(nèi)容,可以借鑒keil中中斷函數(shù)的壓棧情況,當中斷函數(shù)不指定寄存器組時,編譯器一般將PC、ACC、B、DPTR、PSW、R0~R7寄存器入棧,其中PC和DPTR是雙字節(jié)的,其它都是單字節(jié)的,一共15個字節(jié),所以把堆棧數(shù)組設(shè)計成至少15個字節(jié)的,以保證任務(wù)所用的寄存器都在堆棧數(shù)組中包含著。因為每個數(shù)組里放的是寄存器的值,在此就把這每個任務(wù)的堆棧數(shù)組叫做寄存器數(shù)組,暫且把寄存器數(shù)組設(shè)計成15個字節(jié),依次存放PC、ACC、B、DPTR、PSW、R0~R7。
    函數(shù)OSTaskStkInit()傳遞4個參數(shù),第1個參數(shù)task是所創(chuàng)建任務(wù)的起始地址,這個參數(shù)須保存到PC在寄存器數(shù)組的對應(yīng)位置,第2個參數(shù)ppdata是所創(chuàng)建任務(wù)的參數(shù),C51規(guī)則中用R1~R3來傳遞參數(shù)指針,這個參數(shù)須存放到R1~R3在寄存器數(shù)組中的對應(yīng)位置。第3個參數(shù)ptos是棧底指針,從當前地址開始初始化堆棧指針,第4個參數(shù)opt是附加參數(shù),一般不用。
4.2 運行等待任務(wù)中優(yōu)先級最高任務(wù)函數(shù)OSStartHighRdy()
    此函數(shù)在啟動操作系統(tǒng)函數(shù)OSStart()的最后一行調(diào)用,且此函數(shù)不返回,經(jīng)過此函數(shù)后μC/OS接管系統(tǒng)。OSStartHighRdy()不是去調(diào)用用戶任務(wù)函數(shù),而是讓PC指針指向任務(wù)函數(shù)首地址。且任務(wù)函數(shù)的傳遞參數(shù)只有一個,若此參數(shù)正確,則可保證任務(wù)函數(shù)運行正確。在調(diào)用OSStartHighRdy()之前OSStart()已經(jīng)把最高優(yōu)先級任務(wù)的任務(wù)表準備好了,只要把最高優(yōu)先級任務(wù)表的數(shù)據(jù)恢復到堆棧中,再執(zhí)行返回指令即可,以上最關(guān)鍵的是如何讓其返回到最高優(yōu)先級任務(wù)中而不是返回到被調(diào)函數(shù)中。
    當函數(shù)OSStart()調(diào)用函數(shù)OSStartHighRdy()時,斷點地址入棧;當OSStartHighRdy()執(zhí)行完之后,返回斷點。在OSStartHighRdy()中把SP及SP-1的值改為最高優(yōu)先級任務(wù)的地址,這樣OSStartHighRdy()就會返回到最高優(yōu)先級任務(wù)中去運行。
4.3 任務(wù)級的任務(wù)切換函數(shù)OSCtxSw()
    此函數(shù)是保存當前任務(wù)的狀態(tài),然后運行處于就緒態(tài)中的最高優(yōu)先級任務(wù)。前面介紹過不是更改SP去指向寄存器數(shù)組,而是把寄存器數(shù)組的數(shù)復制到堆棧中。先看下一般的情況,在用戶任務(wù)MyTask(void*ppdtat)中調(diào)用TimeDly(),TimeDly()中調(diào)用OSSched(),在OSSched()中有一個宏OS_TASK_SW(),這個宏的目的是讓程序進人函數(shù)OSCtxSw()。參看圖1,就如Fun4為OSCtxSw(),F(xiàn)un3為OSSched(),F(xiàn)un2為TimeDly(),F(xiàn)un1為MyTask()。ADD_D存的是OSSched()的斷點,ADD_C為TimeDly()的斷點,ADD_B為MyTask()的斷點。如果進行任務(wù)切換,應(yīng)該把高優(yōu)先級任務(wù)的地址值賦給ADD_B(即SP-4與SP-5)。
    以上考慮的是最簡單的情況,當任務(wù)比較復雜時,可能更改了ACC、PSW、DPTR或R0~R7的值,在進入高優(yōu)先任務(wù)時,寄存器并不是此任務(wù)的寄存器值,運行的結(jié)果可能不正確。
    在上述情況下如何保證CPU寄存器的值正確,要分兩個階段。第一個階段是把CPU寄存器值保存到要掛起任務(wù)的寄存器數(shù)組中,當剛進入OSCtxSw()時,CPU寄存器的值是要掛起任務(wù)的寄存器值,所以一開始就要鎖定CPU寄存器的值。如果OS_TASK_SW()定義為中斷的話,在進入OSCtxSw()時,CPU寄存器的值被自動壓棧;如果把OS_TASK_SW()定義為函數(shù)時,在進入函數(shù)時使用內(nèi)嵌匯編的方法把CPU寄存器入棧。這時堆棧中又壓入了13個字節(jié),就如在圖1的ADD_D上又壓入了13個字節(jié)的數(shù)據(jù),然后從堆棧中把值取出來放到相應(yīng)任務(wù)的寄存器數(shù)組中。第二個階段是把將要執(zhí)行任務(wù)的寄存器數(shù)組的值復制到堆棧中。此時PC指針在堆棧中對應(yīng)的位置是SP-17與SP-18,SP到SP-12的13個字節(jié)對應(yīng)ACC、B、DPTR、PSW、R0~R7。
4.4 中斷級的任務(wù)切換函數(shù)OSIntCtxSw()
    此函數(shù)和上一個函數(shù)基本思想一致,都要保存當前任務(wù)的狀態(tài),運行處于就緒態(tài)中的優(yōu)先級最高的任務(wù)。二者的不同在于,上個函數(shù)的堆棧中SP-17與SP-18是PC值的位置,SP到SP-12是13個寄存器的位置。當中斷來時,在中斷中調(diào)用函數(shù)OSIntExit(),函數(shù)OSIntExit()調(diào)用函數(shù)OSIntCtxSw(),在OSIntCtxSw()中實現(xiàn)任務(wù)切換。在進入函數(shù)OSIntExit()之前寄存器的值已經(jīng)入棧,所以運行到本函數(shù)時堆棧中SP-17與SP-18是PC值的位置。SP-4到SP-16是13個寄存器的位置。在圖1上,上個函數(shù)的13個寄存器的值被壓入ADD_D上面的13個字節(jié)中,而本函數(shù)是在ADD_B于ADD_C之間壓入的這13個寄存器。
4.5 周期節(jié)拍中斷函數(shù)OSTickISR()
    這個函數(shù)是給系統(tǒng)提供一個節(jié)拍,一般每秒10~100次。如果節(jié)拍頻率太高,μC/OS系統(tǒng)會占用大量硬件資源;如果太低,任務(wù)間的切換又會很慢。
    此函數(shù)首先要保證產(chǎn)生一個周期性的中斷,可以使用硬件定時器,也可以從交流電中獲得50/60Hz的時鐘頻率。這個函數(shù)至少要做3件事:1)進入中斷時,把中斷嵌套層數(shù)計數(shù)器加1,說明又進入一次中斷,也可以直接調(diào)用OSIntEnter()函數(shù);2)調(diào)用時鐘節(jié)拍函數(shù)OSTimeTick(),告知系統(tǒng)又經(jīng)過了一個節(jié)拍;3)調(diào)用OSIntExit()函數(shù),說明要退出中斷了,此函數(shù)會自動處理。

5 結(jié)束語
    文中闡述了在堆??臻g有限的51單片機上運行μC/OS-II系統(tǒng)的移植過程,利用系統(tǒng)棧SP作為數(shù)據(jù)交換的樞紐。在實際應(yīng)用中,如果用系統(tǒng)棧來移植,只需根據(jù)文中的基本思想進行適當?shù)母膶懀纯蛇\行于其他處理器上。如果處理器的堆棧指針尋址空間足夠大,也可以為每個任務(wù)開辟一個棧,通過改變堆棧指針指向不同任務(wù)的??臻g,來實現(xiàn)任務(wù)調(diào)度。
    通過在51單片機上的運行,可以看出μC/OS-II也能在堆??臻g比較少的CPU上運行。

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

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

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

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

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

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

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

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

關(guān)鍵字: 騰訊 編碼器 CPU

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

關(guān)鍵字: 華為 12nm EDA 半導體

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

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

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

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

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

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

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

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉