μC/OS-Ⅱ 操作系统内核知识
目錄
- μC/OS-Ⅱ任務(wù)調(diào)度
- 1.任務(wù)控制塊
- 2.任務(wù)管理
- 3.任務(wù)狀態(tài)
- μC/OS-Ⅱ時(shí)間管理
- μC/OS-Ⅱ內(nèi)存管理
- 內(nèi)存控制塊MCB
- μC/OS-Ⅱ任務(wù)通信
- 1.事件
- 2.事件控制塊ECB
- 3.信號(hào)量
- 4.郵箱
- 5.消息隊(duì)列
操作系統(tǒng)內(nèi)核:在多任務(wù)系統(tǒng)中,提供任務(wù)調(diào)度與切換、中斷服務(wù)
操作系統(tǒng)內(nèi)核為每個(gè)任務(wù)分配CPU時(shí)間,并且負(fù)責(zé)任務(wù)之間的通信。
嵌入式操作系統(tǒng)核心內(nèi)容:
1、進(jìn)程調(diào)度
2、進(jìn)程通信
3、內(nèi)存管理
4、設(shè)備管理
嵌入式操作系統(tǒng)的結(jié)構(gòu):
μC/OS-Ⅱ任務(wù)調(diào)度
用戶在建立操作系統(tǒng)的時(shí)候需要初始化操作系統(tǒng)。
任務(wù)調(diào)度的時(shí)候需要開(kāi)始操作系統(tǒng)。
中斷的代碼不允許其他中斷,需要進(jìn)入代碼臨界段函數(shù),臨界段完成后使用退出代碼臨界段函數(shù)。
有些任務(wù)間一些處理過(guò)程比較重要,不希望被別的任務(wù)打斷,需要使用任務(wù)調(diào)度上鎖函數(shù),完成之后需要使用任務(wù)調(diào)度解鎖函數(shù)。
1.任務(wù)控制塊
任務(wù)控制塊是一個(gè)基于鏈表的數(shù)據(jù)結(jié)構(gòu),任務(wù)控制塊主要用于記錄任務(wù)的堆棧棧頂指針、指向下一個(gè)任務(wù)控制塊的指針、任務(wù)等待的延遲時(shí)間、任務(wù)的當(dāng)前狀態(tài)標(biāo)志與任務(wù)的優(yōu)先級(jí)別等一些與任務(wù)管理有關(guān)的屬性。
當(dāng)任務(wù)的CPU使用權(quán)被剝奪時(shí),μC/OS-Ⅱ用任務(wù)控制塊來(lái)保存該任務(wù)的狀態(tài),從而保證任務(wù)重新獲得CPU使用權(quán)時(shí)從斷點(diǎn)處執(zhí)行。
系統(tǒng)中的每一個(gè)任務(wù)都有一個(gè)任務(wù)控制快,用于存放該任務(wù)的狀態(tài)。任務(wù)控制塊中的各個(gè)單元的值一般不需要用戶改動(dòng)。
2.任務(wù)管理
任務(wù)分為兩個(gè)形式:
1、無(wú)限循環(huán)
2、任務(wù)在運(yùn)行完畢后自我刪除
void Task2() {//用戶任務(wù)代碼//自我刪除osTaskDel(OS_PRIO_SELF);osdelay(); }3、基本的應(yīng)用任務(wù)框架:
int main() {//目標(biāo)板初始化OsInit(); //創(chuàng)建任務(wù)1、2、3......osTaskCreate(Task1,(void*)0,(os_stk *)&Task1_Stack[TASK_STACK_SIZE - 1],Task1_PRIO);osTaskCreate(Task2,(void*)0,(os_stk *)&Task1_Stack[TASK_STACK_SIZE - 1],Task2_PRIO);//開(kāi)始任務(wù)osStart();//進(jìn)入調(diào)度 }3.任務(wù)狀態(tài)
μC/OS-Ⅱ任務(wù)共有4種狀態(tài):
1、睡眠態(tài):任務(wù)處于該狀態(tài)時(shí),僅有任務(wù)代碼,并沒(méi)有操作系統(tǒng)處理
2、就緒態(tài):任務(wù)處于該狀態(tài)時(shí),隨時(shí)可以準(zhǔn)備運(yùn)行
3、運(yùn)行態(tài):正在運(yùn)行的任務(wù),一般是運(yùn)行就緒優(yōu)先級(jí)最高的任務(wù)
4、掛起態(tài):當(dāng)任務(wù)處于該狀態(tài)時(shí),任務(wù)不會(huì)運(yùn)行,只有當(dāng)任務(wù)返回就緒狀態(tài)時(shí),才可以運(yùn)行
每個(gè)任務(wù)的切換如下:
uC/OS-II OS_TASK.C中有關(guān)任務(wù)管理的函數(shù)
μC/OS-Ⅱ時(shí)間管理
μC/OS-Ⅱ內(nèi)核要求用戶提供定時(shí)中斷來(lái)實(shí)現(xiàn)延時(shí)和超時(shí)控制等功能。此定時(shí)中斷叫做時(shí)鐘節(jié)拍。時(shí)鐘節(jié)拍頻率越高,系統(tǒng)的負(fù)載越重。
主要用到的函數(shù):
| OSTimeDly() | 任務(wù)延時(shí)函數(shù) |
| OSTimeDlyHMSM() | 按時(shí)分延時(shí)函數(shù) |
| OSTimeDlyResume() | 讓處在延時(shí)期的任務(wù)結(jié)束延時(shí) |
| OSTimeGet() | 得到系統(tǒng)時(shí)間 |
| OSTimeSet() | 設(shè)置系統(tǒng)時(shí)間 |
1、OSTimeDly():
調(diào)用該函數(shù)會(huì)進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個(gè)優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。
調(diào)用函數(shù)之后,一旦規(guī)定的時(shí)間期滿或者有其他任務(wù)通過(guò)調(diào)用OSTimeDlyResume()取消延時(shí),它就會(huì)立馬進(jìn)入就緒狀態(tài)。
本函數(shù)是將處于運(yùn)行狀態(tài)的轉(zhuǎn)入掛起狀態(tài),當(dāng)延時(shí)結(jié)束的時(shí)候,任務(wù)重新返回到就緒狀態(tài)。
2、OSTimeDlyResume()
使用任務(wù)延遲函數(shù)OSTimeDly()和任務(wù)掛起函數(shù)OSTaskSuspend()的任務(wù)都是處于掛起狀態(tài),但是兩個(gè)處理方法不同:
任務(wù)的時(shí)間延時(shí)與恢復(fù)是通過(guò)設(shè)置任務(wù)控制塊TCB中的OSTCBDly表示。
OSTaskSuspend通過(guò)設(shè)置任務(wù)控制塊TCB中的OS_STAT_SUSPEND標(biāo)志來(lái)表示任務(wù)正在被掛起。
所以通過(guò)任務(wù)回復(fù)函數(shù)OSTaskResume()不能恢復(fù)處于被時(shí)間延時(shí)的任務(wù)
μC/OS-Ⅱ內(nèi)存管理
malloc和free函數(shù)可以動(dòng)態(tài)分配內(nèi)存和釋放內(nèi)存,但是多次這樣做會(huì)把原來(lái)很大的一塊連續(xù)內(nèi)存區(qū)域逐漸地分割成許多非常小而且彼此不相鄰的內(nèi)存區(qū)域,也就是內(nèi)存碎片
操作系統(tǒng)把連續(xù)的大塊內(nèi)存按照分區(qū):
μC/OS-Ⅱ?qū)alloc和free進(jìn)行了改進(jìn),使它們可以分配和釋放固定大小的內(nèi)存塊。用戶應(yīng)用程序可以從不同的內(nèi)存分區(qū)中得到不同大小的內(nèi)存塊,特定的內(nèi)存塊在釋放時(shí)必須重新放回它以前所屬于的內(nèi)存分區(qū)。使用這樣的內(nèi)存管理算法,內(nèi)存碎片問(wèn)題得以解決。
內(nèi)存控制塊MCB
內(nèi)存控制塊MCB是一個(gè)數(shù)據(jù)結(jié)構(gòu),μCOSII用它對(duì)內(nèi)存進(jìn)行管理,來(lái)表示每個(gè)內(nèi)存分區(qū)的信息,系統(tǒng)中的每個(gè)內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊,MCB包括以下內(nèi)容:
μC/OS-Ⅱ任務(wù)通信
1.事件
μC/OS-Ⅱ提供三種特殊的數(shù)據(jù)共享和任務(wù)通信的方法:信號(hào)量、郵箱、消息隊(duì)列。統(tǒng)稱(chēng)為事件。
μC/OS-Ⅱ用事件控制塊ECB表示事件的信息。
任務(wù)或中斷服務(wù)子程序可以通過(guò)ECB向另外的任務(wù)發(fā)事件。
任務(wù)可以等待另一個(gè)任務(wù)或者中斷服務(wù)子程序給它發(fā)事件。
只有任務(wù)可以等待事件發(fā)生,中斷服務(wù)子程序不能。
1、對(duì)于等待的任務(wù),可指定一個(gè)最長(zhǎng)等待事件,以免無(wú)限期等待。中斷服務(wù)程序不能等待事件
2、多個(gè)任務(wù)同時(shí)等待一個(gè)事件,優(yōu)先級(jí)最高的任務(wù)得到該時(shí)間并進(jìn)入就緒態(tài)
2.事件控制塊ECB
ECB是描述事件的數(shù)據(jù)結(jié)構(gòu),它由以下幾個(gè)部分構(gòu)成:
2.OSEventCnt 當(dāng)事件是一個(gè)信號(hào)量時(shí),是信號(hào)量的計(jì)數(shù)器。
3.OSEventTbl[] 和 .OSEventGrp 等待該事件的任務(wù)表和組。
4.OSEventType定義了事件的具體類(lèi)型,可以是信號(hào)量(OS_EVENT_SEM)、郵箱(OS_EVENT_TYPE_MBOX)或消息隊(duì)列(OS_EVENT_TYPE_Q)中的一種。
3.信號(hào)量
信號(hào)量由兩部分組成:該信號(hào)量的計(jì)數(shù)器的值、等待該信號(hào)量的任務(wù)組成的等待任務(wù)列表。
信號(hào)量的接口分為:
建立一個(gè)信號(hào)量
等待一個(gè)信號(hào)量
發(fā)送一個(gè)信號(hào)量
無(wú)等待地請(qǐng)求一個(gè)信號(hào)量
查詢一個(gè)信號(hào)量的當(dāng)前狀態(tài)
信號(hào)量的使用規(guī)范:
任何時(shí)刻都可以建立信號(hào)量
只有任務(wù)可以等待信號(hào)量
中斷和任務(wù)可以發(fā)送信號(hào)量
中斷和任務(wù)可以無(wú)等待地請(qǐng)求一個(gè)信號(hào)量
只有任務(wù)可以查詢一個(gè)信號(hào)量的當(dāng)前狀態(tài)
工作原理
在使用一個(gè)信號(hào)量之前,首先調(diào)用函數(shù)建立該信號(hào)量,對(duì)信號(hào)量的初始計(jì)數(shù)值賦值。
如果信號(hào)量用來(lái)表示一個(gè)或者多個(gè)事件的發(fā)生,那么該信號(hào)量的初始值設(shè)為0;
如果信號(hào)量用來(lái)對(duì)共享資源的訪問(wèn),那么該信號(hào)量的初始值設(shè)為1;
如果信號(hào)量是用來(lái)表示允許任務(wù)訪問(wèn)n個(gè)相同的資源,那么初始值應(yīng)為n,并作為可計(jì)數(shù)的信號(hào)量使用。
任務(wù)根據(jù)信號(hào)量的值來(lái)判斷是否可以運(yùn)行(比如是否對(duì)公共資源可以訪問(wèn))
幾個(gè)任務(wù)往往只建立一個(gè)信號(hào)量sem:
任務(wù)一先執(zhí)行任務(wù)二后執(zhí)行的信號(hào)量變化順序:任務(wù)一先P操作信號(hào)量排斥任務(wù)二的執(zhí)行,完成后再V操作信號(hào)量放行任務(wù)二
4.郵箱
郵箱的接口分為:
建立一個(gè)郵箱
等待一個(gè)郵箱中的消息
發(fā)送一個(gè)消息到郵箱中
無(wú)等待地從郵箱中得到一個(gè)消息
查詢一個(gè)郵箱的狀態(tài)
郵箱使一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量。該指針指向一個(gè)包含特定“消息”的數(shù)據(jù)結(jié)構(gòu)。
如果使用郵箱的目的是通知一個(gè)事件的發(fā)生(發(fā)送一條消息),那么就要初始化該郵箱為NULL,因?yàn)樵陂_(kāi)始時(shí),事件還沒(méi)有開(kāi)始。
如果用郵箱來(lái)共享某些資源,那么就要初始化該郵箱為一個(gè)非NULL的指針,這種情況,郵箱作為一個(gè)二值信號(hào)使用。
郵箱的使用規(guī)范:
1、任何時(shí)刻都可以建立郵箱
2、中斷和任務(wù)可以無(wú)等待地請(qǐng)求郵箱的消息
3、中斷和任務(wù)可以發(fā)送消息到消息
4、只有任務(wù)可以等待一個(gè)郵箱的消息
5、只有任務(wù)可以查詢一個(gè)郵箱的當(dāng)前狀態(tài)
6、郵箱中的消息可以被讀出
5.消息隊(duì)列
一個(gè)任務(wù)通過(guò)消息隊(duì)列向另一個(gè)任務(wù)發(fā)送“一串”指針型的變量,該些指針指向各個(gè)包含“消息”的數(shù)據(jù)結(jié)構(gòu)
消息隊(duì)列可以看成多個(gè)郵箱組成的隊(duì)列,但這些郵箱使用同一個(gè)等待任務(wù)列表
消息隊(duì)列的接口分為:
建立一個(gè)消息隊(duì)列
等待一個(gè)消息隊(duì)列中的消息
發(fā)送一個(gè)消息到消息隊(duì)列中
無(wú)等待地從消息隊(duì)列中得到一個(gè)消息
查詢一個(gè)消息隊(duì)列的狀態(tài)
清空一個(gè)消息隊(duì)列
消息隊(duì)列的使用規(guī)范:
任何時(shí)刻都可以建立消息隊(duì)列中的消息
只有任務(wù)可以等待一個(gè)消息隊(duì)列中的消息
中斷和任務(wù)可以發(fā)送消息到消息隊(duì)列中
中斷和任務(wù)可以無(wú)等待地請(qǐng)求消息隊(duì)列中的消息
只有任務(wù)可以查詢一個(gè)消息隊(duì)列的當(dāng)前狀態(tài)
中斷和任務(wù)可以清空消息隊(duì)列
總結(jié)
以上是生活随笔為你收集整理的μC/OS-Ⅱ 操作系统内核知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: uC/OS-II OS_TASK.C中有
- 下一篇: 《操作系统知识点整理》