新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ucOS學(xué)習(xí)筆記(2)——多任務(wù)是如何實(shí)現(xiàn)的

        ucOS學(xué)習(xí)筆記(2)——多任務(wù)是如何實(shí)現(xiàn)的

        作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
        ucOS是一個(gè)搶占式多任務(wù)操作系統(tǒng),其核心就是人物調(diào)度機(jī)制,該機(jī)制保證了多個(gè)任務(wù)在一個(gè)MCU上并發(fā)執(zhí)行。
        關(guān)于多任務(wù)實(shí)現(xiàn)我們就不得不談一談一段程序運(yùn)行的上下文。所謂程序運(yùn)行的上下文就是指一段代碼(一般以函數(shù)為基本單位)運(yùn)行過程中需要使用到的資源,這個(gè)資源被我稱之為上下文。這些資源包括當(dāng)前系統(tǒng)的基本工作寄存器,函數(shù)使用到的零時(shí)變量,全局變量等等。當(dāng)這些資源被給定后我們無論在何時(shí)去執(zhí)行一個(gè)給定的地址開始的代碼都將得到完全相同的結(jié)果。下邊以具體代碼為例講解該過程,以下代碼get_val為一個(gè)計(jì)算1到10累加和的函數(shù),C代碼如下:
        unsigned char get_val(void)
        {
        unsigned char i = 0;
        unsigned char temp = 0;
        for(i = 0; i < 10; i++)
        temp += i;
        return temp;
        }
        要了解上下文信息我們需要查看匯編代碼,匯編代碼如下:
        get_val:
        C:0x0003 E4 CLR A
        C:0x0004 FF MOV R7,A
        C:0x0005 FE MOV R6,A
        C:0x0006 EF MOV A,R7
        C:0x0007 2E ADD A,R6
        C:0x0008 FE MOV R6,A
        C:0x0009 0F INC R7
        C:0x000A BF0AF9 CJNE R7,#0x0A,C:0006
        C:0x000D AF06 MOV R7,0x06
        C:0x000F 22 RET
        查看匯編代碼我們發(fā)現(xiàn)該函數(shù)使用的系統(tǒng)資源僅僅為累加器A,寄存器R7,R6。因此在任何時(shí)間我們離開該函數(shù),只要在重新執(zhí)行函數(shù)時(shí)恢復(fù)離開時(shí)的上下文,那么函數(shù)執(zhí)行完畢都能夠得到正確的結(jié)果。例如當(dāng)執(zhí)行到C:0x0008處(0008指令還沒有被執(zhí)行),此時(shí)我們由于某種原因改變了PC的值指向了代碼段Q(操作系統(tǒng)稱這一過程為任務(wù)切換),當(dāng)Q代碼段執(zhí)行完畢后再次返回到0008處執(zhí)行,此時(shí)如果恢復(fù)R7,R6,和A那么我們將得到一致的結(jié)果。
        操作系統(tǒng)就是通過在改變PC時(shí)保存當(dāng)前上下文并裝載目標(biāo)PC處的上下文的方式實(shí)現(xiàn)了多任務(wù)并發(fā)執(zhí)行。當(dāng)然,操作系統(tǒng)所進(jìn)行的上下文保存就并不只是保存R6,R7了,它不會(huì)根據(jù)哪個(gè)具體的任務(wù)是用了哪些具體資源而保存這個(gè)任務(wù),它會(huì)采用一個(gè)統(tǒng)一的方式把任何任務(wù)可能是用到的任何資源都保存起來,雖然這樣浪費(fèi)了系統(tǒng)的存儲(chǔ)空間但是它缺保持了任務(wù)切換的統(tǒng)一性和簡(jiǎn)單性。
        在保存上下文時(shí)有幾個(gè)需要注意的問題:
        1.是否保存獨(dú)占資源的上下文?比如系統(tǒng)當(dāng)前一共有20個(gè)任務(wù),只有任務(wù)8使用定時(shí)器2,那么在保存上下文時(shí)需要保存定時(shí)器2的相關(guān)配置么?
        2.保存上下文時(shí)不會(huì)保存全局變量,因?yàn)槿肿兞勘旧砭褪怯脕韨鬟f信息用的,允許在其他地方被改變從而帶給當(dāng)前程序信息。
        3.函數(shù)內(nèi)部的零時(shí)變量不需要保存上下文,因?yàn)樵撟兞繒r(shí)被存儲(chǔ)到函數(shù)自身的棧上的。
        這樣系統(tǒng)根據(jù)某一種機(jī)制在特定時(shí)刻保存當(dāng)前上下文切換的目標(biāo)代碼執(zhí)行實(shí)現(xiàn)了多任務(wù),這種機(jī)制被稱為任務(wù)調(diào)度算法。 ucOS通過兩種途徑實(shí)現(xiàn)任務(wù)調(diào)度:中斷和任務(wù)調(diào)用等待函數(shù)。 中斷又包括系統(tǒng)tick中斷和其他任務(wù)中斷。


        關(guān)鍵詞: ucOS多任

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 绿春县| 郁南县| 通州市| 巴青县| 云龙县| 疏附县| 平江县| 余庆县| 章丘市| 和平县| 天水市| 徐水县| 竹溪县| 门头沟区| 平和县| 汉川市| 会宁县| 湾仔区| 长武县| 永平县| 茶陵县| 巩义市| 讷河市| 娱乐| 田阳县| 扶沟县| 阿拉善右旗| 天门市| 鄂温| 石首市| 凤山市| 泰安市| 泸西县| 江源县| 马山县| 叙永县| 渭源县| 石林| 方正县| 泉州市| 乐安县|