www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > > 嵌入式微處理器
[導讀]這個是在網(wǎng)上看到的一篇文檔,作者的目的是設計一個簡單的嵌入式操作系統(tǒng),只實現(xiàn)一個基本任務調(diào)度器的功能。


這個是在網(wǎng)上看到的一篇文檔,作者的目的是設計一個簡單的嵌入式操作系統(tǒng),只實現(xiàn)一個基本任務調(diào)度器的功能。正如作者所說,雖然不能稱為操作系統(tǒng),但已體現(xiàn)了小型嵌入式操作系統(tǒng)的精髓。對于我們來說是很好的學習資料,可以從中一窺操作系統(tǒng)的面目,今天分享給大家。



1

多任務機制



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


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



2

任務的狀態(tài)


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


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


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


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



3

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


INT32U OSRdyTbl; /* 就緒任務表 */


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


/* 在就緒表中登記就緒任務 */


#define OSSetPrioRdy(prio) { OSRdyTbl |= 0x01<<prio;} //把相應位置1


/* 從就緒表中刪除任務 */


#define OSDelPrioRdy(prio) { OSRdyTbl &= ~(0x01<<prio); }//把相應位清零


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



4

什么是搶占式調(diào)度?


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


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



5

多任務系統(tǒng)的時間管理


與人一樣,多任務系統(tǒng)也需要一個“心跳”來維持其正常運行,這個心跳叫做時鐘節(jié)拍,通常由定時器產(chǎn)生一個固定周期的中斷來充當。


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



6

如何實現(xiàn)多任務?


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


TIPS:


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


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


實現(xiàn)互斥(獨占)訪問的方法有關中斷,關調(diào)度,互斥信號量,計數(shù)信號量等。


6.1 一個任務如何擁有自己的程序代碼


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


TIPS:


臨界資源是一次僅允許一個任務使用的共享資源。每個任務中訪問臨界資源的那段程序稱為臨界區(qū)。


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


6.2 一個任務如何擁有自己的堆棧、數(shù)據(jù)存儲區(qū)


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


什么是任務控制塊?


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



6.3 一個任務如何擁有自己的CPU


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


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



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


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


6.4 如何實現(xiàn)搶占式調(diào)度?


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


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


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


2、高優(yōu)先級的任務因為時鐘節(jié)拍到來,或在中斷處理結束后,內(nèi)核發(fā)現(xiàn)更高優(yōu)先級任務獲得了執(zhí)行條件(如延時的時鐘到時)則在中斷后直接切換到更高優(yōu)先級任務執(zhí)行。這種調(diào)度也稱為中斷級的切換。


6.5 掛起/恢復任務


1. 掛起任務


通過 OSTaskSuspend()可以主動掛起一個任務。OSTaskSuspend()會把任務從任務就緒表中移出,最后重新啟動系統(tǒng)調(diào)度。這個函數(shù)可以掛起任務本身也可以掛起其他任務。


2 .恢復任務(OSTaskResume())


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


-END-


嵌入式ARM

掃描二維碼,關注更多精彩內(nèi)容

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉