專(zhuān)利名稱(chēng):一種嵌入式實(shí)時(shí)操作系統(tǒng)中任務(wù)多次激活的方法
一種嵌入式實(shí)時(shí)操作系統(tǒng)中任務(wù)多次激活的方法技術(shù)領(lǐng)域
本發(fā)明屬于汽車(chē)電子控制技術(shù)領(lǐng)域,更為具體地講,涉及一種嵌入式實(shí)時(shí)操作系 統(tǒng)中任務(wù)多次激活的方法。
背景技術(shù):
1、OSEK標(biāo)準(zhǔn)中關(guān)于任務(wù)多次激活的要求
在汽車(chē)電子控制技術(shù)領(lǐng)域,某些汽車(chē)電子的控制器系統(tǒng)需要使用到嵌入式實(shí)時(shí)操 作系統(tǒng),以提供多任務(wù)的應(yīng)用軟件運(yùn)行環(huán)境。0SEK/VDX提出了有關(guān)汽車(chē)電子控制領(lǐng)域的嵌 入式實(shí)時(shí)操作系統(tǒng)規(guī)范,OSEK 艮口 Open Systemsand the Corresponding Interfaces For Automotive Electronics,是德國(guó)汽車(chē)工業(yè)界1993年聯(lián)合推出的汽車(chē)電子的開(kāi)放式系統(tǒng) 及接口軟件規(guī)范,而VDX即Vehicle Distributed Executive,是法國(guó)汽車(chē)工業(yè)界提出的與 OSEK相似的規(guī)范,1994年和OSEK規(guī)范合并,從而形成0SEK/VDX規(guī)范體系。
圖1是基本任務(wù)的狀態(tài)轉(zhuǎn)換圖。
在0SEK/VDX規(guī)范的 Operating System Specification Version2. 2. 2, July 5th, 2004中,提出了在一個(gè)多任務(wù)的應(yīng)用系統(tǒng)中,基本任務(wù)(以下簡(jiǎn)稱(chēng)任務(wù))可以被多次激活的 概念。其具體含義是
(1)、在一個(gè)系統(tǒng)中的任務(wù)可以被多次激活。任務(wù)的狀態(tài)有運(yùn)行態(tài)、就緒態(tài)和掛起 態(tài)三種,如圖1所示。
有關(guān)任務(wù)狀態(tài)之間轉(zhuǎn)換的原因如表1所示
就緒態(tài)運(yùn)行態(tài)掛起態(tài)就緒態(tài)操作系統(tǒng)進(jìn)行調(diào)度運(yùn)行態(tài)被搶占終止掛起態(tài)激活
表 1
表1中,處于運(yùn)行態(tài)的任務(wù)是正在CPU中運(yùn)行的任務(wù),處于就緒態(tài)的任務(wù)正在等待 CPU資源的分配,而處于掛起態(tài)的任務(wù)則不能參與CPU資源的分配。
(2)、任務(wù)從掛起態(tài)轉(zhuǎn)變?yōu)榫途w態(tài)的過(guò)程稱(chēng)為激活。激活任務(wù)是使用操作系統(tǒng)所提 供的ActivateTask或ChainTask功能調(diào)用完成的。
(3)、在配置允許的情況下,任務(wù)可以被多次激活。所謂多次激活,就是指當(dāng)系統(tǒng)中 的某個(gè)任務(wù)已經(jīng)處于被激活的狀態(tài)之后,任務(wù)已經(jīng)處于運(yùn)行態(tài)或就緒態(tài),被再次激活的情 況。這相當(dāng)于該任務(wù)的代碼在系統(tǒng)中又增加了一個(gè)可運(yùn)行的實(shí)例,或者說(shuō)系統(tǒng)中同時(shí)存在 多個(gè)具有相同功能的就緒任務(wù)對(duì)象,或稱(chēng)為任務(wù)實(shí)例。
(3)、只要未達(dá)到所配置的最大激活次數(shù),新的激活行為是可行的。新激活的任務(wù) 實(shí)例需要在其配置的原始優(yōu)先級(jí)隊(duì)列中排隊(duì),并按激活的先后順序,從隊(duì)列尾部開(kāi)始排隊(duì)。
0)、新激活的任務(wù)實(shí)例在其第一次運(yùn)行的時(shí)候,操作系統(tǒng)需要保證從其代碼的第 一條指令開(kāi)始執(zhí)行。
(5)、任務(wù)的多個(gè)實(shí)例之間不是完全獨(dú)立的,只有當(dāng)其前面的實(shí)例運(yùn)行完成(被終 止)后,后面的實(shí)例才能運(yùn)行,即新的激活行為不會(huì)創(chuàng)建新的執(zhí)行線程。
2、現(xiàn)有嵌入式實(shí)時(shí)操作系統(tǒng)任務(wù)管理機(jī)制的問(wèn)題
現(xiàn)有的嵌入式實(shí)時(shí)操作系統(tǒng)通常采用就緒任務(wù)隊(duì)列來(lái)對(duì)處于運(yùn)行態(tài)、就緒態(tài)的任 務(wù)進(jìn)行管理。就緒任務(wù)隊(duì)列用于管理系統(tǒng)中的就緒任務(wù),包括系統(tǒng)中唯一的運(yùn)行任務(wù),對(duì)相 同優(yōu)先級(jí)上的就緒任務(wù)進(jìn)行排隊(duì)。系統(tǒng)中所有的就緒任務(wù)隊(duì)列形成數(shù)組,數(shù)組的長(zhǎng)度等于 系統(tǒng)的最大優(yōu)先級(jí)數(shù),每個(gè)數(shù)組元素就是一個(gè)就緒任務(wù)隊(duì)列,并且對(duì)應(yīng)一個(gè)優(yōu)先級(jí)。
圖2是現(xiàn)有嵌入式實(shí)時(shí)操作系統(tǒng)的就緒任務(wù)隊(duì)列結(jié)構(gòu)示意圖
如圖2所示,假定某個(gè)系統(tǒng)中一共有n+1個(gè)優(yōu)先級(jí),則就緒任務(wù)隊(duì)列數(shù)組一共就有 n+1個(gè)元素,編號(hào)從0 n,編號(hào)同時(shí)也代表了任務(wù)的優(yōu)先級(jí)。比如在0號(hào)隊(duì)列中排隊(duì)的所有 任務(wù)的優(yōu)先級(jí)都是0,在1號(hào)隊(duì)列中排隊(duì)的所有任務(wù)的優(yōu)先級(jí)都是1,以此類(lèi)推。每個(gè)就緒 任務(wù)隊(duì)列的形式是一個(gè)單向鏈表,比如圖2中的TCBtltl TCBcix形成一個(gè)單向鏈表,TCB20 IX^y形成一個(gè)單向鏈表,等等。TCB是任務(wù)控制塊(Task Control Block)的縮寫(xiě),其下標(biāo), 如00 Ox、20 2y、n0 nz等是對(duì)TCB的二維編號(hào),兩個(gè)維度分別代表該TCB所處的優(yōu)先 級(jí)和它在隊(duì)列中的序號(hào),比如TCBw表示任務(wù)的優(yōu)先級(jí)為0,它在隊(duì)列中的序號(hào)為0 ;而TCB” 表示任務(wù)的優(yōu)先級(jí)為2,它在隊(duì)列中的序號(hào)為y。由于各個(gè)優(yōu)先級(jí)的就緒任務(wù)數(shù)量不一定相 同,因此每個(gè)隊(duì)列的最大序號(hào)也不一定相同。比如圖2所示的系統(tǒng),編號(hào)即優(yōu)先級(jí)為0的隊(duì) 列中共有x+1個(gè)任務(wù)在排隊(duì),其最大序號(hào)為χ ;編號(hào)即優(yōu)先級(jí)為2的隊(duì)列中共有y+Ι個(gè)任務(wù) 在排隊(duì),其最大序號(hào)為1。每個(gè)隊(duì)列有一個(gè)頭指針和尾指針,分別指向隊(duì)列的第一個(gè)任務(wù)控 制塊和最后一個(gè)任務(wù)控制塊。比如在編號(hào)為2的隊(duì)列中,頭指針Head2指向TCB2tl,尾指針 Tail2 指向 TC&y。
對(duì)就緒任務(wù)隊(duì)列的操作包括加入就緒任務(wù)、獲取最早的就緒任務(wù)、取下就緒任務(wù) 等。表2是任務(wù)狀態(tài)變化矩陣,任務(wù)在就緒隊(duì)列中放置或移動(dòng)時(shí)的位置遵循下面的原則
插入新就緒的任務(wù)時(shí),從隊(duì)列尾部插入,因此就緒任務(wù)隊(duì)列的頭指針指向該優(yōu) 先級(jí)中最早就緒的任務(wù),尾指針指向該優(yōu)先級(jí)中最遲就緒的任務(wù)。
操作系統(tǒng)進(jìn)行任務(wù)調(diào)度時(shí),需要獲取當(dāng)前優(yōu)先級(jí)最高的就緒任務(wù),這個(gè)任務(wù)一 定是某個(gè)優(yōu)先級(jí)的就緒任務(wù)隊(duì)列表頭的任務(wù)。
當(dāng)前運(yùn)行任務(wù)優(yōu)先級(jí)改變時(shí),如運(yùn)行任務(wù)釋放資源時(shí)其優(yōu)先級(jí)會(huì)降低,它被插 入到改變之后的優(yōu)先級(jí)的任務(wù)隊(duì)列的頭部。
當(dāng)任務(wù)狀態(tài)發(fā)生變化時(shí),任務(wù)在隊(duì)列中的位置會(huì)發(fā)生變化,取下當(dāng)前運(yùn)行任務(wù) 或就緒任務(wù)時(shí),一定是隊(duì)列頭部的任務(wù)。任務(wù)只有從運(yùn)行態(tài)才能變?yōu)閽炱饝B(tài),因此要掛起 的任務(wù)一定是隊(duì)列上的第一個(gè)任務(wù),所以采用單向鏈表就可以滿(mǎn)足就緒任務(wù)隊(duì)列的操作要 求。
權(quán)利要求
1.一種嵌入式實(shí)時(shí)操作系統(tǒng)中任務(wù)多次激活的方法,其特征在于,包括以下步驟(1)、建立一個(gè)就緒任務(wù)隊(duì)列數(shù)組用于管理就緒任務(wù)對(duì)相同優(yōu)先級(jí)上的就緒任務(wù)進(jìn)行排隊(duì),形成與優(yōu)先級(jí)數(shù)量相同的多個(gè)就緒任務(wù)隊(duì)列; 所有的就緒任務(wù)隊(duì)列形成數(shù)組,數(shù)組的長(zhǎng)度等于優(yōu)先級(jí)數(shù),每個(gè)數(shù)組元素為一個(gè)就緒任務(wù) 隊(duì)列,并且對(duì)應(yīng)一個(gè)優(yōu)先級(jí);就緒任務(wù)隊(duì)列中的就緒任務(wù)用就緒塊指示,每個(gè)就緒塊中有兩個(gè)元素,即指向下一個(gè) 就緒塊的指針和指向?qū)?yīng)任務(wù)控制塊的指針,如果就緒塊位于就緒任務(wù)隊(duì)列最后一個(gè)位 置,則其指向下一個(gè)就緒塊的指針為空;每個(gè)就緒任務(wù)隊(duì)列有一個(gè)頭指針和尾指針,分別指向就緒任務(wù)隊(duì)列的第一個(gè)就緒塊和 最后一個(gè)就緒塊,頭指針用于對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)執(zhí)行時(shí),查找第一個(gè)的任務(wù),尾指針用于新 的就緒塊的插入時(shí),查找尾部就緒塊,如果就緒任務(wù)隊(duì)列中沒(méi)有就緒任務(wù),則頭指針和尾指 針為空;(2)、對(duì)任務(wù)控制塊的數(shù)據(jù)結(jié)構(gòu)進(jìn)行了改進(jìn)·2.1、任務(wù)控制塊中包括以下元素 任務(wù)狀態(tài)任務(wù)狀態(tài)用于記錄任務(wù)狀態(tài),其取值為運(yùn)行、就緒、掛起和就緒及第一次運(yùn)行; 當(dāng)任務(wù)的狀態(tài)值為就緒時(shí),任務(wù)是通過(guò)恢復(fù)其上下文來(lái)運(yùn)行的;當(dāng)任務(wù)的狀態(tài)為就緒 及第一次運(yùn)行時(shí),操作系統(tǒng)從任務(wù)代碼入口地址開(kāi)始執(zhí)行; 眷任務(wù)當(dāng)前激活次數(shù)任務(wù)當(dāng)前激活次數(shù)用于記錄任務(wù)當(dāng)前的激活次數(shù),每當(dāng)任務(wù)增加一個(gè)激活實(shí)例,該元 素的值加1 ;每當(dāng)任務(wù)的一個(gè)實(shí)例運(yùn)行結(jié)束,該元素的值減1 ;當(dāng)任務(wù)當(dāng)前激活次數(shù)被減到0 時(shí),該任務(wù)的狀態(tài)變?yōu)閽炱饝B(tài); 眷任務(wù)當(dāng)前優(yōu)先級(jí)任務(wù)當(dāng)前優(yōu)先級(jí),用于記錄任務(wù)當(dāng)前的優(yōu)先級(jí),其值代表了任務(wù)最早可能運(yùn)行的那個(gè) 實(shí)例的優(yōu)先級(jí); 任務(wù)配置信息表指針任務(wù)配置信息表指針指向任務(wù)配置信息結(jié)構(gòu)體,通過(guò)它可以獲取任務(wù)的靜態(tài)配置的信息; 任務(wù)上下文指針任務(wù)上下文指針指向操作系統(tǒng)存儲(chǔ)的任務(wù)上下文信息,通過(guò)它可以獲取任務(wù)的上下文 信息,當(dāng)任務(wù)的狀態(tài)值為就緒時(shí),該任務(wù)是通過(guò)恢復(fù)其上下文信息來(lái)運(yùn)行的;2. 2、任務(wù)配置信息結(jié)構(gòu)體中的信息都是通過(guò)用戶(hù)靜態(tài)配置,在任務(wù)的運(yùn)行過(guò)程中不改 變的,其相關(guān)元素如下 任務(wù)代碼入口地址通過(guò)任務(wù)代碼入口地址可以獲取任務(wù)的第一條功能代碼,當(dāng)任務(wù)的狀態(tài)為就緒及第一 次運(yùn)行時(shí),操作系統(tǒng)是從任務(wù)代碼的入口地址處執(zhí)行的; 任務(wù)的基本優(yōu)先級(jí)每當(dāng)任務(wù)被新激活一個(gè)實(shí)例時(shí),該實(shí)例的就緒塊是根據(jù)這個(gè)優(yōu)先級(jí)被插入到相應(yīng)的隊(duì) 列尾部的;·3.任務(wù)的最大激活次數(shù)任務(wù)的最大激活次數(shù)記錄該任務(wù)所允許的最大激活次數(shù),每當(dāng)試圖激活一個(gè)任務(wù)時(shí), 如果其當(dāng)前激活次數(shù)小于配置的最大激活次數(shù),則任務(wù)可以被成功激活,即增加一個(gè)可運(yùn) 行任務(wù)實(shí)例,否則不能被激活;(3)、任務(wù)多次激活的操作.3. 1、增加任務(wù)的一個(gè)激活實(shí)例a、對(duì)該任務(wù)的任務(wù)控制塊進(jìn)行以下操作1)、首先判斷任務(wù)控制塊中的任務(wù)當(dāng)前激活次數(shù)是否已經(jīng)等于任務(wù)配置信息結(jié)構(gòu)體中 的任務(wù)的最大激活次數(shù);2)、如果任務(wù)當(dāng)前激活次數(shù)等于任務(wù)的最大激活次數(shù),不能再增加一個(gè)激活實(shí)例,程序 返回;3)、如果任務(wù)當(dāng)前激活次數(shù)小于任務(wù)的最大激活次數(shù),則獲取一個(gè)空閑的就緒塊,并設(shè) 置其指向?qū)?yīng)任務(wù)控制塊的指針指向任務(wù)控制塊,將新的就緒塊插入到任務(wù)的原始優(yōu)先級(jí) 所對(duì)應(yīng)的就緒任務(wù)隊(duì)列的尾部該就緒任務(wù)隊(duì)列原最后的就緒塊的指向下一個(gè)就緒塊的指 針指向新插入的就緒塊,該就緒任務(wù)隊(duì)列的尾指針指向新插入的就緒塊;任務(wù)當(dāng)前激活次 數(shù)加1;如果任務(wù)當(dāng)前狀態(tài)為掛起態(tài),則修改任務(wù)控制塊中任務(wù)狀態(tài)為就緒及第一次運(yùn)行;b、如果操作系統(tǒng)當(dāng)前運(yùn)行任務(wù)的優(yōu)先級(jí)比新激活任務(wù)的優(yōu)先級(jí)低,并且系統(tǒng)滿(mǎn)足調(diào)度 程序的執(zhí)行條件,則操作系統(tǒng)進(jìn)行任務(wù)調(diào)度;如果調(diào)度的結(jié)果是新激活的任務(wù)運(yùn)行,則通過(guò) 當(dāng)前運(yùn)行任務(wù)的任務(wù)控制塊中的任務(wù)上下文指針,保存當(dāng)前運(yùn)行任務(wù)的上下文,并修改激 活任務(wù)的任務(wù)控制塊的任務(wù)狀態(tài)為就緒,跳轉(zhuǎn)到激活任務(wù)的任務(wù)控制塊的任務(wù)代碼入口地 址處,開(kāi)始激活任務(wù)的運(yùn)行;.3. 2、結(jié)束任務(wù)的當(dāng)前運(yùn)行實(shí)例1)、將當(dāng)前運(yùn)行實(shí)例的就緒塊歸還給系統(tǒng);2)、對(duì)任務(wù)控制塊的任務(wù)當(dāng)前激活次數(shù)減1;3)、判斷任務(wù)當(dāng)前激活次數(shù)的值是否為0,如果不為0,則將任務(wù)狀態(tài)設(shè)置為就緒及第 一次運(yùn)行;如果任務(wù)當(dāng)前激活次數(shù)為0,則將任務(wù)狀態(tài)置為掛起態(tài);4)、調(diào)整任務(wù)當(dāng)前優(yōu)先級(jí)為任務(wù)配置信息結(jié)構(gòu)體中的任務(wù)的基本優(yōu)先級(jí);5)如果系統(tǒng)滿(mǎn)足調(diào)度程序的執(zhí)行條件,則操作系統(tǒng)進(jìn)行任務(wù)調(diào)度;對(duì)于新調(diào)度的需要 運(yùn)行的任務(wù)就緒塊,查看就緒塊所指向的任務(wù)控制塊的任務(wù)狀態(tài),如果為就緒,則直接通過(guò) 恢復(fù)其上下文來(lái)恢復(fù)任務(wù)的運(yùn)行,如果為就緒和第一次運(yùn)行,則修改任務(wù)狀態(tài)為就緒,跳轉(zhuǎn) 到任務(wù)代碼入口地址處,開(kāi)始任務(wù)的運(yùn)行。
全文摘要
本發(fā)明公開(kāi)了一種嵌入式實(shí)時(shí)操作系統(tǒng)中任務(wù)多次激活的方法,通過(guò)使用就緒塊,每個(gè)就緒塊中有兩個(gè)元素,即指向下一個(gè)就緒塊的指針(pointerToNextRB)和指向?qū)?yīng)任務(wù)控制塊的指針(pointerToTCB)。同時(shí),對(duì)傳統(tǒng)的任務(wù)控制塊的數(shù)據(jù)結(jié)構(gòu)進(jìn)行了改進(jìn),在任務(wù)控制塊中增加了記錄任務(wù)當(dāng)前激活次數(shù)的元素。這樣,在就緒任務(wù)隊(duì)列中排隊(duì)的結(jié)構(gòu)是就緒塊,它只有兩個(gè)元素,它對(duì)存儲(chǔ)空間的占用少于直接用任務(wù)控制塊排隊(duì)的空間;系統(tǒng)中每一個(gè)任務(wù)始終只有一個(gè)控制塊存在,只有在其前一個(gè)實(shí)例運(yùn)行完成或被終止后,其后面的實(shí)例才能運(yùn)行,即一個(gè)任務(wù)的多個(gè)實(shí)例之間不完全獨(dú)立,任務(wù)的多次激活的行為不會(huì)創(chuàng)建新的線程。
文檔編號(hào)G06F9/46GK102043668SQ20101058244
公開(kāi)日2011年5月4日 申請(qǐng)日期2010年12月10日 優(yōu)先權(quán)日2010年12月10日
發(fā)明者丁旭陽(yáng), 李允 , 陳麗蓉 申請(qǐng)人:成電汽車(chē)電子產(chǎn)業(yè)園(昆山)有限公司