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

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

3天內不再提示

如何設計一個(gè)小型嵌入式操作系統

Q4MP_gh_c472c21 ? 來(lái)源:未知 ? 作者:鄧佳佳 ? 2018-03-08 10:25 ? 次閱讀

前言

本文的目的是設計一個(gè)簡(jiǎn)單的嵌入式操作系統,只實(shí)現一個(gè)基本任務(wù)調度器的功能。雖然不能稱(chēng)為操作系統,但已體現了小型嵌入式操作系統的精髓,可以從中一窺操作系統的面目。

一、多任務(wù)機制

其實(shí)在單一CPU的情況下,是不存在真正的多任務(wù)機制的,存在的只有不同的任務(wù)輪流使用CPU,所以本質(zhì)上還是單任務(wù)的。但由于CPU執行速度非???,加上任務(wù)切換十分頻繁并且切換的很快,所以我們感覺(jué)好像有很多任務(wù)同時(shí)在運行一樣。這就是所謂的多任務(wù)機制。

實(shí)時(shí)系統的特征是延時(shí)可預測,能夠在一個(gè)規定的時(shí)間內(通常是ms級別的)對某些信號做出反應。

二、任務(wù)的狀態(tài)

任務(wù)有下面的特性:任務(wù)并不是隨時(shí)都可以運行的,而一個(gè)已經(jīng)運行的任務(wù)并不能保證一直占有CPU直到運行完。一般有就緒態(tài),運行態(tài),掛起態(tài)等。

運行態(tài):一個(gè)運行態(tài)的任務(wù)是一個(gè)正在使用CPU的任務(wù)。任何時(shí)刻有且只有一個(gè)運行著(zhù)的任務(wù)。

就緒態(tài):一個(gè)就緒態(tài)任務(wù)是可運行的,等待占有CPU的任務(wù)釋放CPU。

掛起態(tài):某些條件不滿(mǎn)足而掛起不能運行的狀態(tài)。

三、如何轉化為就緒態(tài)

INT32U OSRdyTbl; /*就緒任務(wù)表*/上面定義一個(gè)32位變量,每一位代表一個(gè)任務(wù),0表示掛起狀態(tài),1表示就緒狀態(tài)。它記錄了各任務(wù)的就緒與否狀態(tài),稱(chēng)它為就緒表。OSRdyTbl定義為32位變量,對應32個(gè)任務(wù)。當然,定義為64位的話(huà),便最多能支持64個(gè)任務(wù)。這樣,可以定義兩個(gè)宏,實(shí)現把任務(wù)的狀態(tài)變?yōu)榫途w或掛起態(tài)。

/*在就緒表中登記就緒任務(wù)*/#define OSSetPrioRdy(prio) { OSRdyTbl |= 0x01<

/*從就緒表中刪除任務(wù)*/#define OSDelPrioRdy(prio) { OSRdyTbl &= ~(0x01<

任務(wù)之間互相獨立,不存在互相調用的關(guān)系。所有任務(wù)在邏輯上都是平等的。由于任務(wù)之間互相看不見(jiàn),所以他們之間的信息傳輸就無(wú)法當面完成。這就需要各種通信機制如信號量,消息郵箱,隊列等來(lái)實(shí)現。

四、什么是搶占式調度?

調度的概念,通俗的說(shuō)就是系統在多個(gè)任務(wù)中選擇合適的任務(wù)執行。系統如何知道何時(shí)該執行哪個(gè)任務(wù)?可以為每個(gè)任務(wù)安排一個(gè)唯一的優(yōu)先級別,當同時(shí)有多個(gè)任務(wù)就緒時(shí),優(yōu)先運行優(yōu)先級較高的任務(wù)。同時(shí),任務(wù)的優(yōu)先級也作為任務(wù)的唯一標識號。代碼中都是對標識號來(lái)完成對任務(wù)的操作的。

所謂“搶占式調度”是指:一旦就緒狀態(tài)中出現優(yōu)先權更高的任務(wù),便立即剝奪當前任務(wù)的運行權,把CPU分配給更高優(yōu)先級的任務(wù)。這樣CPU總是執行處于就緒條件下優(yōu)先級最高的任務(wù)。

五、多任務(wù)系統的時(shí)間管理

與人一樣,多任務(wù)系統也需要一個(gè)“心跳”來(lái)維持其正常運行,這個(gè)心跳叫做時(shí)鐘節拍,通常由定時(shí)器產(chǎn)生一個(gè)固定周期的中斷來(lái)充當。

OSTimeDly函數就是以時(shí)鐘節拍為基準來(lái)延時(shí)的(在時(shí)鐘的中斷服務(wù)函數中,依次對各個(gè)延時(shí)任務(wù)的延時(shí)節拍數減1。若發(fā)現某個(gè)任務(wù)的延時(shí)節拍數變?yōu)?,則把它從掛起態(tài)置為就緒態(tài)。)。這個(gè)函數完成功能很簡(jiǎn)單,就是先掛起當起當前任務(wù),設定其延時(shí)節拍數,然后進(jìn)行任務(wù)切換,在指定的時(shí)鐘節拍數到來(lái)之后,將當前任務(wù)恢復為就緒狀態(tài)。任務(wù)必須通過(guò)OSTimeDly或OSTaskSuspend讓出CPU的使用權(延時(shí)或等待事件),使更低優(yōu)先級任務(wù)有機會(huì )運行。

六、如何實(shí)現多任務(wù)?

只有一個(gè)CPU,如何在同一時(shí)間實(shí)現多個(gè)獨立程序的運行?要實(shí)現多任務(wù),條件是每個(gè)任務(wù)互相獨立。人如何才能獨立,有自己的私有財產(chǎn)。任務(wù)也一樣,如果一個(gè)任務(wù)有自己的CPU,堆棧,程序代碼,數據存儲區,那這個(gè)任務(wù)就是一個(gè)獨立的任務(wù)。(CPU是通過(guò)多任務(wù)機制獲得的,其他的需要你分配)

TIPS:

如果一個(gè)任務(wù)正在運行某個(gè)公共函數時(shí)(如Printf), 被另一個(gè)高優(yōu)先級的任務(wù)搶占,那么當這個(gè)高優(yōu)先級的任務(wù)也調用同一個(gè)公共函數時(shí),極有可能破壞原任務(wù)的數據。因為兩個(gè)任務(wù)可能共用一套數據。為了防止這種情況發(fā)生,常采用兩種措施:可重入設計和互斥調用。

可重入函數中所有的變量均為局部變量,局部變量在調用時(shí)臨時(shí)分配空間,所以不同的任務(wù)在不同的時(shí)刻調用該函數時(shí),它們的同一個(gè)局部變量所分配的存儲空間并不相同(任務(wù)私有棧中),互不干擾。另外,如果可重入函數調用了其他函數,則這些被調用的函數也必須是可重入函數。

實(shí)現互斥(獨占)訪(fǎng)問(wèn)的方法有關(guān)中斷,關(guān)調度,互斥信號量,計數信號量等。

6.1 一個(gè)任務(wù)如何擁有自己的程序代碼

對于如何實(shí)現多任務(wù),首先是程序代碼,每個(gè)任務(wù)的程序代碼與函數一樣,與51的裸奔程序一樣,每個(gè)任務(wù)都是一個(gè)大循環(huán)。然后是數據存儲區,由于全局變量是系統共用的,各個(gè)任務(wù)共享,不是任務(wù)私有,所以這里的數據存儲區是指任務(wù)的私有變量,如何變成私有?局部變量也。編譯器是把局部變量保存在棧里的,所以好辦,只要任務(wù)有個(gè)私有的棧就行。

TIPS:臨界資源是一次僅允許一個(gè)任務(wù)使用的共享資源。每個(gè)任務(wù)中訪(fǎng)問(wèn)臨界資源的那段程序稱(chēng)為臨界區。

在多任務(wù)系統中,為保障數據的可靠性和完整性,共享資源要互斥(獨占)訪(fǎng)問(wèn),所以全局變量(只讀的除外)不能同時(shí)有多個(gè)任務(wù)訪(fǎng)問(wèn),即一個(gè)任務(wù)訪(fǎng)問(wèn)的時(shí)候不能被其他任務(wù)打斷。共享資源是一種臨界資源。

6.2 一個(gè)任務(wù)如何擁有自己的堆棧、數據存儲區

私有棧的作用是存放局部變量,函數的參數,它是一個(gè)線(xiàn)性的空間,所以可以申請一個(gè)靜態(tài)數組,把棧頂指針SP指向棧的數組的首元素(遞增棧)或最后一個(gè)元素(遞減棧)。即可打造一個(gè)人工的棧出來(lái)。每個(gè)任務(wù)還要有記錄自己棧頂指針的變量,保存在任務(wù)控制塊(TCB)中。

什么是任務(wù)控制塊?

系統中的每個(gè)任務(wù)具有一個(gè)任務(wù)控制塊,任務(wù)控制塊記錄任務(wù)執行的環(huán)境,這里的任務(wù)控制塊比較簡(jiǎn)單,只包含了任務(wù)的堆棧指針和任務(wù)延時(shí)節拍數。任務(wù)控制塊是任務(wù)的身份證。它把任務(wù)的程序與數據聯(lián)系起來(lái),找到它就可以得到任務(wù)的所有資源。

6.3 一個(gè)任務(wù)如何擁有自己的CPU

最后來(lái)看看任務(wù)是如何“擁有”自己的CPU的。只有一個(gè)CPU,各個(gè)任務(wù)共享,輪流使用。如何才能實(shí)現?我們先來(lái)看看中斷的過(guò)程,當中斷來(lái)臨時(shí),CPU把當前程序的運行地址,寄存器等現場(chǎng)數據保存起來(lái)(一般保存在棧里),然后跳到中斷服務(wù)程序執行。待執行完畢,再把先前保存的數據裝回CPU又回到原來(lái)的程序執行。這樣就實(shí)現了兩個(gè)不同程序的交叉運行。

借鑒這種思想不就能實(shí)現多任務(wù)了嗎!模仿中斷的過(guò)程就可以實(shí)現任務(wù)切換運行。任務(wù)切換時(shí),把當前任務(wù)的現場(chǎng)數據保存在自己的任務(wù)棧里面,再把待運行的任務(wù)的數據從自己的任務(wù)棧裝載到CPU中,改變CPU的PC,SP,寄存器等??梢哉f(shuō),任務(wù)的切換是任務(wù)運行環(huán)境的切換。而任務(wù)的運行環(huán)境保存在任務(wù)棧中,也就是說(shuō),任務(wù)切換的關(guān)鍵是把任務(wù)的私有堆棧指針賦予處理器的堆棧指針SP。

創(chuàng )建一個(gè)任務(wù)。它接收三個(gè)參數,分別是任務(wù)的入口地址,任務(wù)堆棧的首地址和任務(wù)的優(yōu)先級。調用本函數后,系統會(huì )根據用戶(hù)給出的參數初始化任務(wù)棧,并把棧頂指針保存到任務(wù)控制塊中,在任務(wù)就緒表標記該任務(wù)為就緒狀態(tài)。最后返回,這樣一個(gè)任務(wù)就創(chuàng )建成功了。

當一個(gè)任務(wù)將要運行時(shí),便通過(guò)取得它的堆棧指針(保存在任務(wù)控制塊中)將這些寄存器出棧裝入CPU相應的位置即可。

6.4 如何實(shí)現搶占式調度?

基于任務(wù)優(yōu)先級的搶占式調度,也就是最高優(yōu)先級的任務(wù)一旦處于就緒狀態(tài),則立即搶占正在運行的低優(yōu)先級任務(wù)的處理器資源。為了保證CPU總是執行處于就緒條件下優(yōu)先級最高的任務(wù),每當任務(wù)狀態(tài)改變后,即判斷當前運行的任務(wù)是否是就緒任務(wù)中優(yōu)先級最高的,否則進(jìn)行任務(wù)切換。

任務(wù)狀態(tài)會(huì )在什么時(shí)候發(fā)生改變呢?有下面兩種情況:

1、高優(yōu)先級的任務(wù)因為需要某種資源或延時(shí),主動(dòng)請求掛起,讓出處理器,此時(shí)將調度就緒狀態(tài)的低優(yōu)先級任務(wù)獲得執行,這種調度稱(chēng)為任務(wù)級的切換。如任務(wù)執行OSTimeDly()或OSTaskSuspend()把自身掛起就屬于這種。

2、高優(yōu)先級的任務(wù)因為時(shí)鐘節拍到來(lái),或在中斷處理結束后,內核發(fā)現更高優(yōu)先級任務(wù)獲得了執行條件(如延時(shí)的時(shí)鐘到時(shí))則在中斷后直接切換到更高優(yōu)先級任務(wù)執行。這種調度也稱(chēng)為中斷級的切換。

6.5 掛起/恢復任務(wù)

1 掛起任務(wù)

通過(guò) OSTaskSuspend()可以主動(dòng)掛起一個(gè)任務(wù)。OSTaskSuspend()會(huì )把任務(wù)從任務(wù)就緒表中移出,最后重新啟動(dòng)系統調度。這個(gè)函數可以?huà)炱鹑蝿?wù)本身也可以?huà)炱鹌渌蝿?wù)。

2 恢復任務(wù)(OSTaskResume())

可以讓被 OSTaskSuspend 或 OSTimeDly 掛起的任務(wù)恢復就緒態(tài),然后進(jìn)行任務(wù)調度。

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

    關(guān)注

    0

    文章

    390

    瀏覽量

    21158

原文標題:如何設計嵌入式系統?帶你理解一個(gè)小型嵌入式操作系統的精髓

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    小型嵌入式操作系統中斷管理的實(shí)現

    小型嵌入式操作系統中斷管理的實(shí)現
    發(fā)表于 04-22 12:57

    【安富萊】【RTX操作系統教程】第2章 嵌入式實(shí)時(shí)操作系統介紹

    樣都是出自Segger公司。2.1.4STM32嵌入式實(shí)時(shí)操作系統解決方案 ST公司有個(gè)手冊是專(zhuān)門(mén)講
    發(fā)表于 01-15 15:35

    如何設計嵌入式系統?帶你理解個(gè)小型嵌入式操作系統的精髓

    這個(gè)是在網(wǎng)上看到的篇文檔,作者的目的是設計個(gè)簡(jiǎn)單的嵌入式操作系統,只實(shí)現
    發(fā)表于 03-13 11:29

    嵌入式操作系統怎么選擇?

    嵌入式操作系統是ARM CPU的軟件基礎,從8位/16位單片機發(fā)展到以arm CPU核為代表的32位嵌入式處理器,嵌入式操作系統將替代傳統的
    發(fā)表于 04-07 07:13

    嵌入式操作系統有哪些

    與驅動(dòng)開(kāi)發(fā)培訓班)  Windows CE是微軟公司開(kāi)發(fā)的個(gè)開(kāi)放的、可升級的32位嵌入式操作系統,是基于掌上型電腦類(lèi)的電子設備操作系統。W
    發(fā)表于 06-20 15:13

    嵌入式操作系統的發(fā)展

    .嵌入式操作系統1.嵌入式操作系統的發(fā)展(1)Tiny OS操作系統1)開(kāi)源深度輕量級
    發(fā)表于 10-27 07:26

    嵌入式Linux操作系統

    ARM+LINUX路線(xiàn),主攻嵌入式Linux操作系統及其上應用軟件開(kāi)發(fā)目標:(1)掌握主流嵌入式微處理器的結構與原理(初步定為arm9)(2)必須掌握
    發(fā)表于 10-27 10:22

    什么是嵌入式操作系統? 

    、INTEGRITY、OSE、C ExecuTIve  什么是嵌入式操作系統 嵌入式操作系統種支持
    發(fā)表于 10-28 07:35

    基于Linux的嵌入式操作系統

    嵌入式操作系統一、嵌入式操作系統概述1.1 嵌入式操作系統的特點(diǎn)1.2
    發(fā)表于 11-08 09:05

    什么是嵌入式操作系統?嵌入式操作系統有何功能

    什么是嵌入式操作系統?常見(jiàn)的嵌入式操作系統有哪幾種?嵌入式操作系統有何功能?
    發(fā)表于 12-24 07:07

    Contiki學(xué)習筆記

    Contiki 是一個(gè)適用于有內存的嵌入式系統的開(kāi)源的、高可移植的、支持網(wǎng)絡(luò )的多任務(wù)操作系統。包括一個(gè)多任務(wù)核心、TCP/IP 堆棧、程序集以及低能耗的無(wú)線(xiàn)通訊堆棧。Contiki 采用 C 語(yǔ)言開(kāi)發(fā)的非常
    發(fā)表于 01-06 11:30 ?32次下載

    基于S3C2440A的SD卡文件系統的設計與實(shí)現

    μC/OS-II是一種可移植的,可植入ROM的,可裁剪的,搶占式的,實(shí)時(shí)多任務(wù)小型嵌入式操作系統,它采用可剝離式內核實(shí)施任務(wù)調度,實(shí)時(shí)性很強,而且每個(gè)任務(wù)具有唯一的優(yōu)先級,能夠保證就續表中任務(wù)優(yōu)先級最高的任務(wù)優(yōu)先執行。
    發(fā)表于 03-30 14:15 ?2267次閱讀
    基于S3C2440A的SD卡文件<b class='flag-5'>系統</b>的設計與實(shí)現

    一個(gè)小型嵌入式操作系統設計

    最后來(lái)看看任務(wù)是如何“擁有”自己的CPU 的。只有一個(gè) CPU,各個(gè)任務(wù)共享,輪流使用。如何才能實(shí)現?我們先來(lái)看看中斷的過(guò)程,當中斷來(lái)臨時(shí),CPU 把當前程序的運行地址,寄存器等現場(chǎng)數據保存起來(lái)(一般保存在棧里),然后跳到中斷服務(wù)程序執行。待執行完畢,再把先前保存的數據裝回CPU 又回到原來(lái)的程序執行。這樣就實(shí)現了兩個(gè)不同程序的交叉運行。
    的頭像 發(fā)表于 01-29 10:09 ?1113次閱讀
    一個(gè)<b class='flag-5'>小型</b><b class='flag-5'>嵌入式</b><b class='flag-5'>操作系統</b>設計

    一個(gè)小型嵌入式操作系統設計:精髓都有了!

    上面定義一個(gè) 32 位變量,每一位代表一個(gè)任務(wù),0 表示掛起狀態(tài),1 表示就緒狀態(tài)。它記錄了各任務(wù)的就緒與否狀態(tài),稱(chēng)它為就緒表。OSRdyTbl 定義為 32 位變量,對應32 個(gè)任務(wù)。當然,定義為 64 位的話(huà),便最多能支持 64 個(gè)任務(wù)。這樣,可以定義兩個(gè)宏,實(shí)現把任務(wù)的狀態(tài)變?yōu)榫途w或掛起態(tài)。
    的頭像 發(fā)表于 08-05 17:06 ?1710次閱讀
    一個(gè)<b class='flag-5'>小型</b><b class='flag-5'>嵌入式</b><b class='flag-5'>操作系統</b>設計:精髓都有了!

    設計一個(gè)簡(jiǎn)單的嵌入式系統

    這個(gè)是在網(wǎng)上看到的一篇文檔,作者的目的是設計一個(gè)簡(jiǎn)單的嵌入式操作系統,只實(shí)現一個(gè)基本任務(wù)調度器的功能。正如作者所說(shuō),雖然不能稱(chēng)為操作系統,但已體現了小型
    發(fā)表于 08-25 11:13 ?7791次閱讀
    設計一個(gè)簡(jiǎn)單的<b class='flag-5'>嵌入式</b><b class='flag-5'>系統</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看