chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

μC/OS-II內核如何在RTOS多個任務中作為任務棧的方法研究

電子設計 ? 來源:單片機與嵌入式系統(tǒng)應用 ? 作者:彭良清 ? 2020-10-09 10:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在μC/OS-II內核中,各個不同的任務使用獨立的堆??臻g,堆棧的大小按每個任務所需要的最大堆棧深度來定義,這種方法可能會造成堆??臻g浪費。本文敘述如何在RTOS中多個任務共用連續(xù)存儲空間作為任務棧的方法,并詳細比較二者的優(yōu)缺點和適用性。

關于μC/OS-II這個實時內核及其應用已經有很多文章介紹了,對于學習RTOS的人來說,這個系統(tǒng)是很好的學習起點。雖然文獻的源代碼沒有行號和函數(shù)名交叉索引表等,給源代碼閱讀造成一些困難(可使用BC31的grep查找功能,提高閱讀效率),好在代碼不是很長,前面又有詳細的中文說明,對于有一定X86匯編C語言基礎的人來說,仍然可以在不長的時間內掌握。

μC/OS-II內核是一個搶先式內核,可以進行任務間切換,也可以讓一個任務在得不到某個資源時休眠一定時間后再繼續(xù)運行;提供了用于共享資源管理的信號燈,用于進程通信的消息隊列和郵箱,甚至提供了存儲器管理機制,一個比較全面的系統(tǒng)。

μC/OS-II內核有些地方仍然值得改進,比如該系統(tǒng)不支持時間片調度。如果有一個任務中一段死循環(huán)代碼(或者條件循環(huán)代碼),代碼就會永遠(或長時間)在此處執(zhí)行,調度程序無法控制,其它任務也就是不到及時執(zhí)行。這種搶先式實際上和非搶先式系統(tǒng)存在著同樣問題。當然,如果這種代碼不一個BUG,問題是可以解決的,在不提供時間片調度的搶先式系統(tǒng)中,一般采取信號燈,或者任務主動休眠的方法(對于μC/OS-II,很容易改造成支持時間片調度,只要在定時中斷服務程序調用OSIntCtxSw()函數(shù)即可);非搶先式系統(tǒng)一般采取有限狀態(tài)機方法,不使用這種耗時很長的循環(huán)代碼。不過,無論如何,對RTOS的使用者來說,這畢竟會使得任務函數(shù)的編碼不能隨心所欲。

ΜC/OS-II內核的另外一個值得改進的地方就是其任務棧管理方法。在μC/OS-II內核中,各個不同的任務使用獨立的堆??臻g,堆棧的大小按每個任務所需要的最大堆棧深度來定義,這種方法可能會造成堆??臻g的浪費。下面討論如何在RTOS中多個任務共用一段連續(xù)存儲空間作為傻堆棧。

μC/OS-II內核如何在RTOS多個任務中作為任務棧的方法研究

1 任務切換要保存的數(shù)據

簡單地說,一個任務可看作一個運行中的C函數(shù)。對于搶先式RTOS來說,在任務切換時,應保存當前任務的各種現(xiàn)場數(shù)據?,F(xiàn)場數(shù)據包括局部變量、各個CPU寄存器、堆棧指針和程序被中止的任務指針。CPU寄存器是任何任務代碼均會用到的;而局部變量,一般的編譯器是將其它安排在堆棧空間中,堆棧指針也是各任務公用的,所以也需要保存。

對于全局變量,由于一般是在內存中的固定位置,各任務所占用的空間完全獨立,所以不需要保存。

在X86環(huán)境中,要保存的CPU寄存器共14個16位寄存器;通用寄存器8個(AX、BX、CX、DX、SP、BP、SI、BI)、段寄存器4個(CS、DS、ES、SS)以及指令指針I(yè)P和標志寄存器FR各1個。

2 C編譯器中變量在堆棧中的位置

對于一個存在函數(shù)調用嵌套的C程序來說,大部分編譯器將傳遞的參數(shù)和函數(shù)本身的局部變量放在了堆棧中,編譯器會自動生成壓棧(push)和彈棧(pop)代碼,以保存上級函數(shù)的運行寄存器。

假設函數(shù)main()調用funl(),而funl()調用fun2(),則在執(zhí)行fun2()中的代碼時,堆棧映像如圖1所示(X86 CPU的情況)。

對于RTOS軟件,堆棧中的各種數(shù)據就是一個任務的作現(xiàn)場。一般CPU的堆棧指針SP只有一個,在進行任務切換時,必須將掛起任務所使用的堆棧內容保存起來,以便使該任務在下次喚醒時能從原地繼續(xù)運行。

3 μC/OS-II對任務棧的處理方法與缺陷

μC/OS-II為了保存任務堆棧中的數(shù)據,對每個任務定義一個數(shù)組變量作為堆棧,在任務切換時,將CPU堆棧指針SP指向該數(shù)組中的某個元素,即棧頂,如圖2所示。

比如,在其ex21.c文件中定義的任務堆棧語句為:

OS_STK TaskStartStk[TASK_STK_SIZE]; /*啟動任務堆棧*/

OS_STK TaskClkStk[TASK_STK_SIZE]; /*時鐘任務堆棧*/

OS_STK TasklStk[TASK_STK_SIZE]; /*任務1#,任務堆棧*/

……

以上各任務堆棧數(shù)組變量在初始化函數(shù)OSTCBInit()中被會給了任務控制塊OS_TCB的OSTCBStkPtr變量。在任務切換時,μC/OS-II調用OSCtxSw匯編過程(OS_CPU_A.ASM文件),將CPU的SP指針指向該變量,從而使每個任務使用獨立的任務堆棧。

LES BX,DWORD PTR DS:_OSTCBCur

;保存掛起任務的堆棧指針SP

MOV ES:[BX+2],SS

MOV ES:[BX+0],SP

……

LESB X,DWORD PTR DS:_OSTCBHighRdy ;切換SP到要運行任務的堆棧空間

MOV SS,ES:[BX+2]

MOV SP,ES:[BX]

……

在代碼中,變量OSTCBHighRdy(OSTCBCur)和堆棧指針變量OSTCBStkPtr的數(shù)值是同同的,因為OSTCBStkPtr是結構OSTCBHighRdy的第一個變量。

這種任務棧處理方法的缺點是可能造成空間的浪費。因為一個任務如果堆棧滿了,該任務也就無法運行,即使其它任務的堆棧還有空間可用。當然,這種方法的好處是任務棧切換的時間非常短,只需要幾條指令。

4 共用空間的堆棧處理方法

(1)棧共用連續(xù)存儲空間

如果多個任務使用同一段連續(xù)空間作為堆棧,這樣各個堆棧之間就可以互補使用。在前面說過,共用空間的問題在于一個任務運行時不能破壞其它任務的堆棧數(shù)據。為簡單起見,先看圖3所示兩個任務的情況。

假定任務1首次運行時任務棧為空。運行一段時間后任務2運行,堆棧空間繼續(xù)往上生長。這次任務切換不需要修改CPU的SP數(shù)值,但需要記下任務1的棧頂位置SP1(圖3中)。

在任務2運行一段時間后,RTOS又切換到任務1運行。在切換時,不能簡單地將SP指針修改回SP1的數(shù)值,因為這樣堆棧向上生長時會破壞任務2堆棧中的數(shù)據。辦法是將原來任1務堆棧保存的數(shù)據移動到靠棧頂?shù)奈恢?,而將任?堆棧數(shù)據下移到靠棧底的位置,堆棧指針SP實際上不需要修改(圖3右)。

考慮到更為一般的情況,有N個任務,當前運行的任務為k,下一個運行的任務為j,在共用任務堆棧時必須做的工作有:

*為每個任務定義棧頂和棧底2個堆棧指針;

*在任務切換時,將待運行任務j的堆棧內容移動到靠棧頂位置,同時將其堆棧上方的任務堆棧下移,修改被移動推棧的任務堆棧指針。

假設我們定義的任務??臻g和任務的棧指針變量為:

void TaskSTK[MAX_STK_LEN];/*任務堆??臻g*/

typedef struct TaskSTKPoint{

int TaskID;

int pTopSTK;

int pBottomSTK;

}TASK_STK_POINT;

TASK_STK_POINT pTaskSTK[MAX_TASK_NUM]; /*存放每個任務的棧頂和棧底指針*/

任務棧指針數(shù)組pTaskSTK的元素個數(shù)同任務個數(shù)。為了堆棧交換,需要另外一塊臨時存儲空間,其大小可按單個任務棧最大長度定義,用于中轉堆棧交換的內容。堆棧內容交換的偽C算法可寫為:

StkEechange(int CurTaskID,int RunTaskID)

{ /*2個參數(shù)為當前運行任務號和下一運行任務號*/

void TempSTK[MAX_PER_STK_LEN]; /*注意該變量長度可小于TaskSTK*/

L=任務RunTaskTD的堆棧長度;

①將TaskSTK頂部的L字節(jié)移動到TempSTK中;

②將RunTaskID任務的堆棧內容移動到TaskSTK頂部;

③將RunTaskID堆棧上方(移動前位置)所有內容下移L個字節(jié);

④修改RunTask堆棧上方(移動前位置)所有任務棧頂和棧底指針(pTaskSTK變量);

};

該算法的平均時間復雜度可計算如下:

O(T)=SL/2+SL/2+SL%26;#215;N/2

式中,第一、二項為步驟①和步驟②時間,第三項為步驟③時間;SL表示每個任堆棧的最大長度(即MAX_PER_STK_LEN),N表示任務數(shù)。

取SL為64字節(jié),任務數(shù)為16個,則數(shù)據項平均移動次數(shù)為576。假設每次移動指令時間為2μs,則一次任務棧移動時間長達約1ms。所以在使用該方法時,為了執(zhí)行時間盡量短,編碼時應仔細推敲。

從空間上說,共用任務棧比獨立任務棧優(yōu)越。假設獨立任務棧方法中每個堆棧空間為K,任務數(shù)為N,則獨立任務棧方式的堆??偪臻g為N%26;#215;K。在共用任務棧時,考慮各任務互補的情況,TaskSTK變量不需要定義為N%26;#215;K長度,可能定義為二分之一或者更小就可以了。

另外,這種方法不需要在任務切換時修改CPU的SP指針。

(2)工作棧和任務堆棧

上節(jié)共用任務棧算法的缺點是:任務切換時的堆棧內容交換算法復雜,占用時間長。另外一個折中的方法是設計一個工作堆棧,用于給當前運行的任務使用;在任務切換時,將工作棧內容換出得另外的存儲空間,該空間可以動態(tài)申請,其大小按實際需要即可。

這種方法看起來和獨立任務棧的方法類似,需要N+1塊存儲空間,其中一塊用于工作??臻g。和獨立任務堆棧相比,其區(qū)別有2點:

①SP指針所指向的空間始終是同一塊存儲空間,即工作棧;

②每個任務棧的大小不需要按最大空間定義,可以動態(tài)按實際大小從內存中分配空間。

對于8031這種處理器結構,由于堆棧指針只能指向其內部存儲器,大小十分有限。采取這種方法,可將工作棧設在內部RAM,將任務棧設在外部RAM,擴展了堆??臻g。

和上一種共用堆棧方法相比,這種方法的交換時間要短,其時間復雜度約為1.5倍最大任務棧長度。

5 總結

獨立任務棧的方法適合于存儲器充足、任務切換頻繁、對任務切換時間要求較高的場合,一般主要用在16位或者32位微處理器平臺環(huán)境。值得注意的是,在某些微處理器中,雖然可使用的數(shù)據存儲器可以設計得較大,但堆棧所能使用的存儲器卻是有限的。比如8031系列存儲器,堆棧只能使用內部的128字節(jié)數(shù)據存儲器,即使系統(tǒng)中有64K字節(jié)的外部數(shù)據存儲器,任務棧的總空間也不能超過128字節(jié)。這種處理器使用共用任務棧結構的RTOS就更好一些。

由于共用任務棧系統(tǒng)需要較長的任務切換時間,不適于任務切換頻繁的場合,在很多嵌入式系統(tǒng)中,長時間只有幾個任務會處于運行狀態(tài),其它任務在特定的條件下才會運行。對于RTOS的使用者,也可以適當?shù)貏澐秩蝿?,來減小任務切換的時間。

無論使用哪種方法,在存儲空間有限時,任務棧的長度應仔細計算。計算的根據是任務中的函數(shù)嵌套數(shù)、函數(shù)局部變量長度。對于共用任務棧,還要考慮同時運行態(tài)和掛起態(tài)的最大任務數(shù)。一些編譯器可以生成堆棧溢出檢查代碼,在調試時可將該編譯開關打開,以測試需要的實際堆棧長度。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5434

    瀏覽量

    124528
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11080

    瀏覽量

    217114
  • 編譯器
    +關注

    關注

    1

    文章

    1662

    瀏覽量

    50228
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    μC/OS-II的特點

    機制。正如上文所提到的,μC/OS-II是一個支持多任務的操作系統(tǒng)。一個完整的程序可以劃分成幾個任務,不同的任務執(zhí)行不同的功能。這樣,一個
    發(fā)表于 07-15 14:51

    UC/OS-II操作系統(tǒng)——任務(一)

    本帖最后由 ax918 于 2012-2-22 14:41 編輯 UC/OS-II操作系統(tǒng)內核的主要工作就是對任務進行管理和調度?! ?、任務的概念  從應程設計的角度來看,UC
    發(fā)表于 02-22 14:40

    μC/OS-II的移植方法

    概述嵌入式操作系統(tǒng)μC/OS-II是一個公開源代碼的占先式多任務的微內核RTOS,其特點可以概括為以下幾個方面:公開源代碼,代碼結構清晰、明
    發(fā)表于 07-25 08:14

    何在μCOS-II的多任務系統(tǒng)實現(xiàn)SOPC硬件設計?

    本人在教學及科研實驗,對基于μCOS-II的多任務系統(tǒng)在SOPC的設計總結出了具體實現(xiàn)方法
    發(fā)表于 10-17 08:20

    μC/OS-II內核任務調度及內存管理,看完你就懂了

    μC/OS-II內核任務調度及內存管理嵌入式系統(tǒng)的應用軟件介紹
    發(fā)表于 04-28 06:19

    μC/OS-II 擴充任務數(shù)的方法

    任務現(xiàn)在已成為操作系統(tǒng)和并發(fā)程序設計中一個非常重要的概念, 一般認為任務是一個簡單的程序,該程序可以認為CPU 完全只屬于自己。在μC/OS-II
    發(fā)表于 04-15 09:28 ?7次下載

    μC/OS-II 任務調度機制的改進

    介紹μC/OS-II 任務調度機制,并提出一種改進方法,使μC/OS-II變成一個兼?zhèn)鋵崟r與分時
    發(fā)表于 04-15 11:21 ?14次下載

    μC OS-II 任務處理的一種改進方法

    在μC/OS-II 內核,各個不同的任務使用獨立的堆??臻g,堆棧的大小按每個任務所需要的最大堆
    發(fā)表于 05-15 13:46 ?14次下載

    μC OS-II 擴充任務數(shù)的方法

    μC/OS-II 擴充任務數(shù)的方法
    發(fā)表于 05-16 14:50 ?8次下載

    基于ARM的嵌入式操作系統(tǒng)μC/OS-II的移植

        介紹了μC/OS-II RTOS內核結構和任務管理,闡述了ARM 嵌入式芯片的體系結構,給出了基于
    發(fā)表于 09-04 09:49 ?28次下載

    μC/OS-II任務處理的改進設計

    已經有不少的文章介紹了有關μC/OS-II這個實時內核及其應用。在很多的處理器上,μC/OS-II都得到了應用。μ
    發(fā)表于 04-18 22:12 ?1256次閱讀

    μC/OS-II縮短中斷關閉時間方法

    筆者將以μC/OS-II實時內核為例,通過對μC/OS-II的改進,向讀者描述一種縮短實時操作系統(tǒng)中斷關閉時間的
    發(fā)表于 05-23 11:15 ?1371次閱讀
    μ<b class='flag-5'>C</b>/<b class='flag-5'>OS-II</b><b class='flag-5'>中</b>縮短中斷關閉時間<b class='flag-5'>方法</b>

    一種μC/OS-II任務調度硬件指令的實現(xiàn)

    C/OS-II 是一種基于優(yōu)先級的搶占式多任務實時操作系統(tǒng),包含了實時內核、任務管理、時間管理、任務
    發(fā)表于 10-30 11:18 ?2次下載
    一種μ<b class='flag-5'>C</b>/<b class='flag-5'>OS-II</b><b class='flag-5'>任務</b>調度硬件指令的實現(xiàn)

    uC/OS-II任務處理的一種改進方法

    關于C/OS-II這個實時內核及其應用已經有很多文章介紹了,對于學習RTOS的人來說,這個系統(tǒng)是很好的學習起點。雖然文獻[1]的源代碼沒有行號和函數(shù)名交叉索引表等,給源代碼閱讀造成一些
    發(fā)表于 11-01 16:11 ?0次下載
    uC/<b class='flag-5'>OS-II</b><b class='flag-5'>任務</b><b class='flag-5'>棧</b>處理的一種改進<b class='flag-5'>方法</b>

    μC/OS-II的多任務系統(tǒng)實時性解析

    摘要 從產品研發(fā)的角度,針對小資源系統(tǒng)中使用C/OS-II的實時性和優(yōu)先級關系進行了分析,提出了可刪除任務的靈活應用和可變大小任務的實現(xiàn)
    發(fā)表于 11-06 14:29 ?2次下載
    μ<b class='flag-5'>C</b>/<b class='flag-5'>OS-II</b>的多<b class='flag-5'>任務</b>系統(tǒng)實時性解析