目錄
? ?實時多任務
1.1? 任務生命周期管理
?1.2? 任務狀態(tài)控制
1.3? 任務調度
1.4? ?用戶接口
結語:
? ? ? ?實時操作系統(tǒng)是基于多任務和任務間通信的概念的操作系統(tǒng),多任務環(huán)境允許一個實時應用由一組各自獨立的任務組成,每個任務擁有自己的執(zhí)行線程和一組系統(tǒng)資源。
? ?實時多任務
? ? ? ? 任務管理和調度是實時操作系統(tǒng)的核心,該模塊提供任務生命周期管、控制和調度支持。
?? ?
? ? ? ? 任務生命周期管理包括:任務創(chuàng)建、任務刪除等。
?? ?
? ? ? ? 任務狀態(tài)控制包括:任務在就:緒態(tài)(Ready)、阻塞(Pend)、掛起(Suspend)、延時(Delay)四個狀態(tài)間的切換,任務優(yōu)先級設置與獲取,任務調度鎖定。
?? ?
? ? ? ?任務調度,提供基于優(yōu)先級搶占式任務調度,在同優(yōu)先級的任務提供可選的Round-Robin時間片輪轉調度。
1.1? 任務生命周期管理
? ?1、任務創(chuàng)建和刪除。
? ? 任務創(chuàng)建使用taskSpawn()函數(shù),
? ? 函數(shù)原型:??
?? ?int taskSpawn()
?? ?{
?? ??? ?char* name,
?? ??? ?int periority,
?? ??? ?int options,
?? ??? ?int stackSize,
?? ??? ?FUNCPTR entryPt;
?? ??? ?int arg1,
?? ??? ?int arg2,
?? ??? ?int arg3,
?? ??? ?int arg4,
?? ??? ?int arg5,
?? ??? ?int arg6,
?? ??? ?int arg7,
?? ??? ?int arg8,
?? ??? ?int arg9,
?? ??? ?int arg10
?? ??? ?}
?? ?
? ? ? ?該函數(shù)共有15參數(shù),分別表示:任務名、任務優(yōu)先級、任務選項字、任務堆棧大小、任務入口函數(shù)、以及任務入口函數(shù)的10個可選參數(shù);
?? ?
? ? ? 任務創(chuàng)建和激活成功后返回任務ID號,失敗時返回ERROR;
?? ?
? ? ? 針對參數(shù)有一下要求:
?? ?
?? ?1)任務名:便于記憶,最好是以t或者u開始的一個字符串;
?? ?
?? ?2)任務優(yōu)先級:0~255之間,最高優(yōu)先級是0,最低優(yōu)先級是255,建議創(chuàng)建任務優(yōu)先級在150之后;
?? ?
?? ?3)任務選項字:當任務有浮點數(shù)操作計算或者調用浮點計算函數(shù)時,任務選項字是VX_FP_TASK;當任務沒有浮點數(shù)操作計算,也不調用浮點計算函數(shù)時,任務選項字是0;
?? ?
?? ?4)任務堆棧:創(chuàng)建任務時分配的內存,包含了任務控制塊(TCB)和任務名,剩余內存是任務堆棧,默認使用0XEE填充,這種初始化填充主要用于任務堆棧檢查函數(shù)checkStack();
?? ?
?? ?5)任務入口函數(shù):任務創(chuàng)建和激活成功后,系統(tǒng)調用這個函數(shù),最多有10個可選參數(shù),任務入口函數(shù)在任務堆??臻g運行,因此必須設置足夠大的任務堆棧,并且任務入口函數(shù)及其調用函數(shù)中不允許使用大量占用空間的數(shù)組,結構體變量等。
?? ?
?? ??2、任務刪除函數(shù);
?? ?
?? ?taskDelete()
?? ?
?? ?函數(shù)原型:
?? ?
?? ?STATUS taskDelete
?? ?{
?? ??? ?int tid;
?? ?}
?? ?taskDelete()只有一個參數(shù),是任務名稱,任務刪除成功后返回OK,失敗時返回ERROR。
?1.2? 任務狀態(tài)控制
? ? ? 任務狀態(tài)控制包括:就緒(Ready)、阻塞(Pend)、掛起(Suspend)、延遲(Delay)。
?? ?
? ? ? ?內核記錄系統(tǒng)中每個任務的當前狀態(tài),應用程序的內核函數(shù)調用可以使得每個任務從一個狀態(tài)轉換為另一種狀態(tài),當任務被創(chuàng)建時,任務進入掛起狀態(tài),激活很快,任務可以先創(chuàng)建后激活,還有一種方式是直接使用taskSpawn例程,可以在創(chuàng)建任務的同時激活任務。且任務可以在任何狀態(tài)下被和刪除。
?? ?
?? ?
?? ?一、任務狀態(tài)情況:
?? ?
?? ?1)READY:任務處于等待獲取CPU并執(zhí)行的狀態(tài);
?? ?
?? ?2)PEND:任務等待某種資源而處于阻塞狀態(tài);
?? ?
?? ?3)DELAY:任務處于等待一個時間段的狀態(tài);
?? ?
?? ?4)SUSPEND:任務處于一個不可執(zhí)行的狀態(tài),該狀態(tài)主要用于調試,suspend狀態(tài)除了禁止任務執(zhí)行外,并不禁止任務的狀態(tài)遷移,因此,pended-suspend狀態(tài)的任務
?? ?
?? ?可以被unlock,而處于delayded-suspend狀態(tài)的任務可以被awake;
?? ?
?? ?5) DELAY + S:任務處于delay-suspend的狀態(tài)
?? ?
?? ?6)PEND + S:任務處于pended-suspend的狀態(tài)
?? ?
?? ?7)PEND + T:任務處于pend狀態(tài),但有timeout值,一旦超時,任務的pend狀態(tài)將被清除;
?? ?
?? ?8)PEND + S + T:任務處于pend-suspend狀態(tài),但有timeout值,一旦超時,任務的pend狀態(tài)將被清除;
?? ?
?? ?9)stste + 1:任務處于state狀態(tài)(stste表示上述狀態(tài)之一),且有繼承優(yōu)先級1;
?? ?
?? ?引起任務遷移的函數(shù)如下:
?? ?
?? ?ready-->pended 【semTake()/msgQReceive】
?? ?
?? ?ready-->delayed 【taskDelay】
?? ?
?? ?ready-->suspend【taskSuspend】
?? ?
?? ?pended-->ready 【semGive()/msgQSend】
?? ?
?? ?pended-->suspend 【taskSuspend】
?? ?
?? ?delayed-->ready 【expired delay 延時耗盡】
?? ?
?? ?delayed-->suspend 【taskSuspend】
?? ?
?? ?suspend-->ready 【taskResume()/taskActivate()】
?? ?
?? ?suspended-->pended 【taskResume】
?? ?
?? ?suspended-->delayed 【taskResume】
?? ?
?? ?二、任務優(yōu)先級設置
?? ?
?? ?優(yōu)先級設置函數(shù)原型:taskPriorityGet()
?? ?
?? ?STATUS taskPrioritySet()
?? ?{
?? ??? ?int tid;
?? ??? ?int newpPriority
?? ?}
?? ?函數(shù)taskPriority()有兩個參數(shù),第一個參數(shù)是任務的id號,第二個參數(shù)是新優(yōu)先級,優(yōu)先級范圍從0~255,優(yōu)先級設置成功返回OK,當任務ID非法時返回ERROER;
?? ?
?? ?三、任務優(yōu)先級獲取
?? ?
?? ?任務優(yōu)先級獲取函數(shù)原型:
?? ?
?? ?taskPriorityGet()
?? ?
?? ?STATUS taskPriorityGet()
?? ?{
?? ??? ?int tid,
?? ??? ?int *pPriority
?? ?}
?? ?
? ? ? ?函數(shù)taskPriorityGet()有兩個參數(shù),第一個參數(shù)是任務ID號,第二個參數(shù)是整型指針,表示優(yōu)先級地址。任務優(yōu)先級獲取任務時返回OK,當任務非法時返回ERROR。
1.3? 任務調度
? ? ? ?多任務需要一個調度算法在就緒任務之間分配CPU,VxWorks的默認調度算法是基于優(yōu)先級的可搶占調度,但是用戶也可以在相同優(yōu)先級任務之家選擇Round-Robin調度算法;
?? ?
?? ?1)可搶占的優(yōu)先級調度
?? ?
? ? ? ?使用可搶占優(yōu)先級調度時,每個任務都有自己的優(yōu)先級,內核保證將CPU分配給優(yōu)先級最高的任務并運行該任務,這個調度是可搶占的,如果有一個比當前任務優(yōu)先級更高的任務就緒時,內核馬上保存當前任務的上下文,切換到高優(yōu)先級任。
?? ?
?? ?
?? ?2)Round-Robin調度算法;
?? ?
? ? ? ?可搶占優(yōu)先級調度可以由Round-Robin調度算法擴充,Round-Robin調度算法嘗試在所有相同優(yōu)先級就緒任務之間平等共享CPU,Round-Robin調度使用時間片成組地在相同優(yōu)先級任務之間公平分配CPU,每個組中的每個任務執(zhí)行指定的時間間隔或者時間片,然后在另一個任務執(zhí)行相同的時間,循環(huán)往復。Round-Robin調度由函數(shù)kernelTimeSize()啟動,將時間片或者時間間隔作為參數(shù)。這個時間間隔是每個任務在放棄CPU給相同優(yōu)先級之間執(zhí)行的所有時間。如果一個任務在它的時間片被高優(yōu)先級任務搶占,它的運行計數(shù)器被保存。當任務重新執(zhí)行時就恢復;
?? ?
?? ?3)搶占鎖
?? ?
? ? ? 內核可以通過調用taskLock()和taskUnlock()來使調度器生效和失效。當一個任務調taskLock()使調度器失效,任務運行時沒有基于優(yōu)先級的搶占發(fā)生,然而,如果任務被阻塞或者被懸置時,調度器就從就緒隊列中去取出最高優(yōu)先級的任務運行,當設置禁止搶占的任務接觸阻塞,再次開始運行時,搶占又被禁止。搶占鎖阻止了任務上下文切換但并不封鎖中斷處理。搶占所可以用于完成互斥,但是為了保證系統(tǒng)響應應該保持搶占鎖定的時間最短。
1.4? ?用戶接口
?? ??1、任務調度控制函數(shù):
?? ??? ?
?? ??? ??? ?1)kernelTimeSlice():控制Round-Robin調度;
?? ??? ?
?? ??? ??? ?2)taskPerioritySet():改變任務優(yōu)先級;
?? ??? ?
?? ??? ??? ?3)taskLock():取消任務調度;
?? ??? ?
?? ??? ??? ?4)taskUnlock():啟動任務調度;
?? ??? ?
?? ??? ?2、任務創(chuàng)建函數(shù):
?? ??? ?
?? ??? ??? ?1)taskSpawn():創(chuàng)建和激活一個新任務;
?? ??? ??? ?
?? ??? ??? ?2)taskInit():初始化一個新任務;
?? ??? ??? ?
?? ??? ??? ?3)taskActivate():激活一個已經初始化的任務;
?? ??? ??? ?
?? ??? ?3、任務名稱和ID函數(shù):
?? ??? ?
?? ??? ??? ?1)taskName():得到和任務ID相關的任務名稱;
?? ??? ??? ?
?? ??? ??? ?2)taskNameTold():得到和任務名稱相關的任務ID;
?? ??? ??? ?
?? ??? ??? ?3)taskIDSelf():得到調用任務的ID;
?? ??? ??? ?
?? ??? ??? ?4)taskIdVerify():檢驗特定任務的存在性;
?? ??? ??? ?
?? ??? ?4、任務選項函數(shù):
?? ??? ?
?? ??? ??? ?1)taskOptionsGet():檢驗任務選項;
?? ??? ??? ?
?? ??? ??? ?2)taskOptionsSet():設置任務選項;
?? ??? ??? ?
?? ??? ?5、任務信息函數(shù):
?? ??? ?
?? ??? ??? ?1)taskIdListGet():將所有激活任務的id填充一個數(shù)組;
?? ??? ??? ?
?? ??? ??? ?2)taskInfoGet():得到一個任務的信息;
?? ??? ??? ?
?? ??? ??? ?3)taskPriorityGet():檢查任務的優(yōu)先級;
?? ??? ??? ?
?? ??? ??? ?4)taskRegsGet():檢查任務的寄存器;
?? ??? ??? ?
?? ??? ??? ?5)taskRegsSet():設置任務的寄存器;
?? ??? ??? ?
?? ??? ??? ?6)taskIsSuspended():檢查任務是否掛起;
?? ??? ??? ?
?? ??? ??? ?7)taskIsReady():檢查任務是否就緒;
?? ??? ??? ?
?? ??? ??? ?8)taskTcb():得到任務控制塊指針;
?? ??? ??? ?
?? ??? ?6、任務刪除函數(shù):
?? ??? ?
?? ??? ??? ?1)exit():終止調用任務,釋放內存空間(只是任務堆棧和任務控制塊);
?? ??? ??? ?
?? ??? ??? ?2)taskDelete():終止指定的任務,釋放內存空間(只是任務堆棧和任務控制塊);
?? ??? ??? ?
?? ??? ??? ?3)taskSafe():從刪除中保護調用任務;
?? ??? ??? ?
?? ??? ??? ?4)taskUnsafe():撤銷taskSafe()(使得調用任務對于刪除可用)
?? ??? ??? ?
?? ??? ?7、任務控制函數(shù)
?? ??? ?
?? ??? ??? ?1)taskSuspend():掛起一個任務u;
?? ??? ??? ?
?? ??? ??? ?2)taskResume():重新激活一個任務;
?? ??? ??? ?
?? ??? ??? ?3)taskRestart():重啟一個任務;
?? ??? ??? ?
?? ??? ??? ?4)taskDelay():延時一個任務,延時單位是滴答;
?? ??? ??? ?
?? ??? ??? ?5)nanosleep():延時一個任務,延時單位是ns;
?? ??? ??? ?
?? ??? ?8、任務擴展函數(shù)
?? ??? ?
?? ??? ??? ?1)taskCreatHookAdd():添加一個函數(shù),在任務創(chuàng)建時調用;
?? ??? ??? ?
?? ??? ??? ?2)taskCreatHookDelete():刪除一個原先添加的任務創(chuàng)建函數(shù);
?? ??? ??? ?
?? ??? ??? ?3)taskSwitchHookAdd():添加一個函數(shù),在任務切換時調用;
?? ??? ??? ?
?? ??? ??? ?4)taskSwitchHookDelete():刪除一個原先添加的任務切換函數(shù);
?? ??? ??? ?
?? ??? ??? ?5)taskDeleteHookAdd():添加一個函數(shù),在任務刪除時調用;
?? ??? ??? ?
?? ??? ??? ?6)taskDeleteHookDelete():刪除一個原來添加的任務刪除函數(shù);
?? ??? ??? ?
?? ??? ??? ?文章來源:http://www.zghlxwxcb.cn/news/detail-629231.html
結語:
? ? ? ?以上就是對VxWorks實時多任務的介紹啦,接下來的篇章我將展開來講一講VxWorks任務間間通信的結構和使用方式,希望與各位讀者朋友一起探討進步,我是指尖比比,我們下個好文再見!?。?br> ?? ? ??
?? ?
?? ?
?? ?
?? ?
?? ?
?? ?
?? ?
?? ?
?? ?
?? ?文章來源地址http://www.zghlxwxcb.cn/news/detail-629231.html
到了這里,關于【Vxworks操作系統(tǒng)】實時多任務介紹-NO.2的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!