專利名稱:基于tc1767平臺(tái)的csa節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及微控制器的操作系統(tǒng),特別涉及一種基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法。
背景技術(shù):
TC1767型芯片為英飛凌公司開發(fā)的一款基于TriCore架構(gòu)的汽車用32位微控制器(MCU),TC1767可作為汽車的核心CPU使用。TriCore架構(gòu)使用鏈表結(jié)構(gòu)的CSA(ContextSave Area,上下文保存區(qū)域)作為保存上下文的區(qū)域,以實(shí)現(xiàn)中斷、陷阱以及函數(shù)調(diào)用時(shí)產(chǎn)生的上下文切換。由于芯片本身的限制,現(xiàn)有的運(yùn)行于TC1767芯片上的操作系統(tǒng),還無法實(shí)現(xiàn)任務(wù)的切換,以及多任務(wù)的處理。
發(fā)明內(nèi)容
本發(fā)明針對(duì)現(xiàn)有基于TC1767芯片的操作系統(tǒng)無法進(jìn)行任務(wù)切換和多任務(wù)處理的缺點(diǎn),提供了一種通過在現(xiàn)有操作系統(tǒng)中建立和引入一個(gè)全新的CSA節(jié)點(diǎn)管理器的方法來實(shí)現(xiàn)任務(wù)切換功能的基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法。為實(shí)現(xiàn)上述目的,本發(fā)明可采取下述技術(shù)方案
基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,包括以下具體步驟為每個(gè)任務(wù)分別建立CSA鏈表,所述任務(wù)與所述CSA鏈表之間——對(duì)應(yīng),所述CSA鏈表包括FCL和PCL ;切換所述CSA鏈表為當(dāng)前CSA鏈表以實(shí)現(xiàn)任務(wù)切換。作為優(yōu)選,所述為每個(gè)任務(wù)分別建立CSA鏈表的步驟在TC1767上電后,第一個(gè)任務(wù)啟動(dòng)之前立即執(zhí)行。作為優(yōu)選,在所述建立CSA鏈表的過程中,保留一定數(shù)目的節(jié)點(diǎn),所述保留的節(jié)點(diǎn)數(shù)目由SYS_START_USED確定。作為優(yōu)選,還包括,在所述任務(wù)第一次執(zhí)行前對(duì)所述CSA鏈表進(jìn)行初始化,具體步驟為1)將所述任務(wù)的PCL的所有節(jié)點(diǎn)插入所述任務(wù)的FCL中;2)從FCL中取出兩個(gè)節(jié)點(diǎn)分別為第一節(jié)點(diǎn)和第二節(jié)點(diǎn),所述第一節(jié)點(diǎn)作為上部上下文儲(chǔ)存區(qū)域,將所述任務(wù)的堆棧指針的值寫入所述第一節(jié)點(diǎn)的SP子域,所述第二節(jié)點(diǎn)作為下部上下文儲(chǔ)存區(qū)域,將所述任務(wù)的入口地址寫入所述第二節(jié)點(diǎn)的RA子域;3)將所述第一節(jié)點(diǎn)以頭插法插入所述PCL ;4)將所述第二節(jié)點(diǎn)以頭插法插入所述PCL。作為優(yōu)選,所述CSA鏈表的節(jié)點(diǎn)數(shù)目為預(yù)設(shè)值。作為優(yōu)選,還包括,在所述任務(wù)的FCL耗盡后,增加所述CSA鏈表的節(jié)點(diǎn)數(shù)目。作為優(yōu)選,所述任務(wù)包括IDLE任務(wù)。作為優(yōu)選,所述任務(wù)的TCB包括以下成員變量TPcxCur、TFcxCur> TPcxOrig、TFcxOrig、TLcxOrig,所述成員變量用于保存所述CSA鏈表的句柄,其中,TPcxCur用于保存當(dāng)前PCL的首節(jié)點(diǎn)地址,TFcxCur用于保存當(dāng)前FCL的首節(jié)點(diǎn)地址,TPcxOrig用于保存初始PCL的首節(jié)點(diǎn)地址,TFcxOrig用于保存初始FCL的首節(jié)點(diǎn)地址,TLcxOrig用于保存初始FCL的尾節(jié)點(diǎn)地址。本發(fā)明由于采用了以上技術(shù)方案,具有顯著的技術(shù)效果
引入了一個(gè)新的CSA節(jié)點(diǎn)管理器,該CSA節(jié)點(diǎn)管理器是由每一個(gè)任務(wù)的CSA鏈表以及對(duì)這些CSA鏈表的切換或者其他處理步驟所組成的,由于CSA節(jié)點(diǎn)管理器的引入,在基于TC1767平臺(tái)的操作系統(tǒng)上實(shí)現(xiàn)了任務(wù)切換。任務(wù)切換的功能是通過切換與任務(wù)相對(duì)應(yīng)的CSA鏈表所實(shí)現(xiàn)的,而切換CSA鏈表只需要修改TC1767芯片中的上下文寄存器即可實(shí)現(xiàn),因此切換過程所消耗的CPU周期較少,CSA鏈表切換十分迅速。
圖1為所述CSA鏈表的結(jié)構(gòu)示意圖。
具體實(shí)施例方式下面結(jié)合實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)描述。實(shí)施例1
基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,使用基于TriCore架構(gòu)的TC1767芯片,TriCore架構(gòu)使用鏈表結(jié)構(gòu)的CSA節(jié)點(diǎn)。每個(gè)CSA節(jié)點(diǎn)都是16字的內(nèi)存區(qū)域,16字對(duì)齊。每個(gè)CSA節(jié)點(diǎn)剛好可以保存一個(gè)上部或者下部上下文。CSA節(jié)點(diǎn)通過一個(gè)鏈接字首尾鏈接形成CSA鏈表。鏈接字有2個(gè)域4位的段索引和16位的偏移量,可以通過這兩個(gè)域來生成下一個(gè)CSA的EA。每個(gè)段可以用作CSA的區(qū)域是4MB,所以可有216個(gè)CSA節(jié)點(diǎn)。CSA鏈表的結(jié)構(gòu)如圖1所示,此外,TC1767芯片還包括3個(gè)上下文管理寄存器,分別為FCX、PCX和LCX,其中,F(xiàn)CX寄存器指向可用的空閑上下文鏈表(FCL :Free Context List),即保存FCL首節(jié)點(diǎn)的地址,PCX寄存器指向已使用的非空閑上下文鏈表(PCL Previous ContextList),即保存PCL的首節(jié)點(diǎn)的地址,LCX寄存器保存FCL尾節(jié)點(diǎn)的地址。所述的CSA節(jié)點(diǎn)管理器通過以下具體步驟實(shí)現(xiàn)為每個(gè)任務(wù)分別建立CSA鏈表,更進(jìn)一步的,所述任務(wù)也包括IDLE任務(wù),即系統(tǒng)的空閑任務(wù),所述任務(wù)與所述CSA鏈表之間一一對(duì)應(yīng),所述CSA鏈表包括FCL和PCL ;切換所述CSA鏈表為當(dāng)前CSA鏈表以實(shí)現(xiàn)任務(wù)切換。為每個(gè)任務(wù)分別建立CSA鏈表的代碼實(shí)現(xiàn)如下,函數(shù)initAlITaskCSAs O負(fù)責(zé)為包括IDLE任務(wù)在內(nèi)的所有任務(wù)建立CSA鏈表,以下代碼也可以在TC1767啟動(dòng)后,第一個(gè)任務(wù)之前立即執(zhí)行。此時(shí),在執(zhí)行時(shí),需要保留一部分的CSA節(jié)點(diǎn),這部分保留的CSA節(jié)點(diǎn)即可以用于FCL的節(jié)點(diǎn)耗盡后,增加FCL的節(jié)點(diǎn)數(shù)目,同時(shí),由于在第一個(gè)任務(wù)被執(zhí)行之前,也會(huì)隨機(jī)執(zhí)行代碼,需要為這些代碼保留一部分的CSA節(jié)點(diǎn)。保留的CSA節(jié)點(diǎn)的數(shù)目由SYS_START_USED確定,SYS_START_USED的值可以在源代碼中設(shè)定或者在操作系統(tǒng)啟動(dòng)時(shí)從相應(yīng)的配置文件中讀取
boolean initAllTaskCSAs O{
int csaldx, taskldx;
TaskType curTask; unsignedint cfcx, clcx;unsignedint tCsaCnt;
cfcx = _mfcr (FCX) ; /* 獲得 CPU 的 FCX 句柄 */ clcx = _mfcr (LCX) ; /* 獲得 CPU 的 LCX 句柄 */
/*預(yù)留一些CSA節(jié)點(diǎn),用于當(dāng)前代碼到第一個(gè)任務(wù)啟動(dòng)的過程*/for(csaIdx = O; csaldx< SYS_START_USED ; csaldx++)/*SYS_START_USED為當(dāng)前代碼到第一個(gè)任務(wù)啟動(dòng)過程中所需要的CSA節(jié)點(diǎn)的數(shù)目*/
{
if (EquelUint32 (cfcx, clcx)) /* 這里會(huì)發(fā)生 Trap,不會(huì)執(zhí)行到 */
{
return FALSE;
}
cfcx = getCsaLink( getEffectiveAddress ( cfcx ) );/* 獲得下一個(gè)CSA節(jié)點(diǎn)的有效地址RA,作為當(dāng)前FCL的句柄*/
}
curTask = OSTCBTbl; /*獲得任務(wù)TCB數(shù)組的句柄*/ for (taskldx = O; taskldx< TASK_NUM; taskldx++)/* 為 TCB 數(shù)組中的每個(gè)TCB循環(huán)執(zhí)行以下代碼,TASK_NUM為TCB的數(shù)目*/
{
tCsaCnt = curTask->CsaCnt; /*從任務(wù)TCB中獲得當(dāng)前任務(wù)配置的CSA
節(jié)點(diǎn)的數(shù)目*/
curTask->TFcxOrig = cfcx; /*初始化這個(gè)任務(wù)的FCL的句柄*/ curTask->TPcxOrig = 0;/*初始化這個(gè)任務(wù)的PCL的句柄*/
/*為這個(gè)任務(wù)分配CSA節(jié)點(diǎn)*/
for (csaldx = O; csaIdx〈tCsaCnt ; csaldx++)/* 此處進(jìn)行循環(huán)以生成
CSA鏈表*/
{
if (EquelUint32 (cfcx, clcx)) /* 當(dāng)返回值為 true,表不 FCL 中的節(jié)點(diǎn)已經(jīng)用盡,將引發(fā)trap,因此,條件體事實(shí)上不會(huì)被執(zhí)行*/
{
return FALSE;
}
cfcx = getCsaLink( getEffectiveAddress ( cfcx ) );/*獲得下一個(gè)節(jié)點(diǎn)的有效地址RA*/
}
curTask->TLcxOrig = cfcx ;/* 初始化這個(gè)任務(wù)的 TLcxOrig */ curTask ++; /*處理下一個(gè)任務(wù)*/
}
return TRUE; /* 成功執(zhí)行,返回 TRUE*/
}o
為了實(shí)現(xiàn)CSA鏈表的切換,需要在任務(wù)的TCB中添加下列的成員變量TPcxCur、TFcxCur> TPcxOrig、TFcxOrig、TLcxOrig,所述成員變量用于保存所述CSA鏈表的句柄,其中,TPcxCur用于保存當(dāng)前PCL的首節(jié)點(diǎn)地址,TFcxCur用于保存當(dāng)前FCL的首節(jié)點(diǎn)地址,TPcxOrig用于保存初始PCL的首節(jié)點(diǎn)地址,TFcxOrig用于保存初始FCL的首節(jié)點(diǎn)地址,TLcxOrig用于保存初始FCL的尾節(jié)點(diǎn)地址。這里的初始PCL和初始FCL是指對(duì)CSA鏈表進(jìn)行增刪操作之前的FCL和PCL的句柄。在所述任務(wù)第一次執(zhí)行前需要對(duì)該任務(wù)的CSA鏈表進(jìn)行初始化,具體步驟為1)將所述任務(wù)的PCL的所有節(jié)點(diǎn)插入所述任務(wù)的FCL中;2)從FCL中取出兩個(gè)節(jié)點(diǎn)分別為第一節(jié)點(diǎn)和第二節(jié)點(diǎn),所述第一節(jié)點(diǎn)作為上部上下文儲(chǔ)存區(qū)域,將所述任務(wù)的堆棧指針的值寫入所述第一節(jié)點(diǎn)的SP子域,所述第二節(jié)點(diǎn)作為下部上下文儲(chǔ)存區(qū)域,將所述任務(wù)的入口地址寫入所述第二節(jié)點(diǎn)的RA子域;3)將所述第一節(jié)點(diǎn)以頭插法插入所述PCL ;4)將所述第二節(jié)點(diǎn)以頭插法插入所述PCL,偽代碼如下
void TCsaInit(TaskType PTCB)
{
·把PCL中未釋放的CSA節(jié)點(diǎn)釋放,即把TPcxCur上的所有節(jié)點(diǎn)頭刪法刪掉,然后頭插法插入到 TFcxCur 中,這樣之后也就保證了 TPcxCur == TPcxOrig, TFcxCur == TFcxOrig;
從TFcxOrig取出一個(gè)節(jié)點(diǎn),作為上部上下文存儲(chǔ)區(qū)域,初始化這個(gè)區(qū)域,并指定區(qū)域中SP子域(Stack Pointer,棧指針)的值為任務(wù)的棧指針值,頭插法插入到TPcxCur中;從TFcxOrig再次取出一個(gè)節(jié)點(diǎn),作為下部上下文存儲(chǔ)區(qū)域,初始化這個(gè)區(qū)域,并指定區(qū)域中RA子域(Return Address,返回地址)的值為任務(wù)的入口地址,頭插法插入到TPcxCur 中;
Io上述TCsaInitO的可以由以下代碼實(shí)現(xiàn) voidTCsalnit(TaskType Task)
{
unsignedintupCsaEa, IoCsaEa; /^upCsaEa, IoCsaEa 分別為上部上下文和下部上下文的有效地址*/
unsignedintcfcx, cpcx;/*cfcx, cpcx 為 FCL 的句柄或者 PCL 的句柄 */ cfcx = Task->TFcx0rig;/*get task’s fcx*//* 獲得任務(wù)的 FCL 句柄 */ cpcx = Task->TPcx0rig;/*get task’s pcx*//* 獲得任務(wù)的 PCL 句柄 */
/*以下代碼實(shí)現(xiàn)清除PCL的節(jié)點(diǎn)并將這些節(jié)點(diǎn)插入FCL中*/clearTaskUsedCsa (Task) ; /*把當(dāng)前任務(wù)PCL中所有的節(jié)點(diǎn)插入FCL中*/upCsaEa = delCsaNode (&cfcx) ;/*從任務(wù)的FCL中取出一個(gè)節(jié)點(diǎn),并刪除,返回的是節(jié)點(diǎn)的有效地址*/
((unsignedint *)upCsaEa) [2] = (uint32) Task->0STCBStkCur;/*初始化上部上下文中的SP子域*/
((unsignedint *)upCsaEa) [3] = (uint32)Task_>PTask;/*初始化上部上下文
中的All*/
((unsignedint *) upCsaEa) [I] = (uint32) 0x00000980 ;/* 初始化上部上下文中的PSW程序狀態(tài)字*/
addCsaNode (&cpcx,upCsaEa) ;/*把這個(gè)節(jié)點(diǎn)插入到任務(wù)的PCL表頭*/IoCsaEa = delCsaNode ( &cfcx );/*從任務(wù)的FCL中取出一個(gè)節(jié)點(diǎn),并刪除,返回的是節(jié)點(diǎn)的有效地址*/
((unsignedint *) IoCsaEa) [I] = (uint32)Task_>PTask;/*初始化下部上下文
中的All*/
addCsaNode (&cpcx,IoCsaEa) ;/*把這個(gè)節(jié)點(diǎn)插入到任務(wù)的PCL表頭*/ Task->TFcxCur = cfcx;/* 寫回到任務(wù)的 FCL 句柄 */
Task->TPcxCur = cpcx;/* 寫回到任務(wù)的 PCL 句柄 */return ;
}o voidcIearTaskUse dCsa (TaskType Task)
{
unsignedintcfcx, cpcx;
unsignedinttmpNode;
cfcx = Task->TFcxCur;
cpcx = Task->TPcxCur;
while (cpcx != 0)/* 任務(wù)的 PCL 不為空 */
{
tmpNode = delCsaNode ( &cpcx ) ;/* 從 PCL 中刪除一個(gè)節(jié)點(diǎn) */ addCsaNode (&cfcx,tmpNode) '卜將上述從PCL中刪除的插入FCL中*/
}
Task->TFcxCur = cfcx;/* 寫回 */
Task->TPcxCur = cpcx;/* 寫回 */ return ;
}o這里,clearTaskUsedCsa ()用于把當(dāng)前任務(wù)PCL中所有的節(jié)點(diǎn)插入FCL中。切換任務(wù)即切換CSA鏈表包括以下步驟
保存任務(wù)save :保存任務(wù)時(shí)的任務(wù)保存上下文就是保存當(dāng)前PCX、FCX到被調(diào)度出去的任務(wù)的 TPcxCur,TFcxCur 中?;謴?fù)任務(wù)load :恢復(fù)任務(wù)時(shí)的任務(wù)恢復(fù)上下文就裝載被調(diào)度進(jìn)來的任務(wù)的TPcxCur, TFcxCur,TLcxOrig 到 CPU 的 PCX,F(xiàn)CX, LCX。執(zhí)行任務(wù)Run :先執(zhí)行TCsaInit O,然后再執(zhí)行恢復(fù)任務(wù)load。實(shí)現(xiàn)上述步驟需要以下4個(gè)任務(wù)切換函數(shù)=TaskRun O、TaskSaveRun O、TaskLoadRun O、TaskSaveLoadRun O,偽代碼如下
TaskRun O{
TCsaInit O,執(zhí)行恢復(fù)任務(wù)load;
}o
TaskSaveRun (PreTCB, CurTCB)
{
TCsaInit () ; TaskSaveLoadRun ();
}oTaskLoadRun (CurTCB)
{
執(zhí)行恢復(fù)任務(wù)load; rslcx ();
}oTaskSaveLoadRun(PreTCB, CurTCB)
{
svlcx() ;/*保存下部上下文*/
保存當(dāng)前 CPU 的 PCX,F(xiàn)CX 到 PreTCB 的 TPcxCur,TFcxCur ;
保存CPU的SP到PreTCB的SP ;
從 CurTCB 加載出 TPcxCur,T`FcxCur,TLcxOrig 到 CPU 的 PCX,F(xiàn)CX, LCX;rslcxO ;
}o上述四個(gè)任務(wù)切換函數(shù)可以由以下代碼實(shí)現(xiàn),
inline void TaskSaveLoadRun(TaskType PSavedTcb, TaskType PLoadTcb)
{
—asm(〃svlcx〃);/*保存下部上下文*/
0STCB01d->TFcxCur = _mfcr (FCX) ;/* 保存前一個(gè)任務(wù)的 FCL 句柄 */0STCB01d->TPcxCur = _mfcr (PCX) ;/* 保存前一個(gè)任務(wù)的 PCL 句柄 */
_mtcr (FCX, OSTCBCur->TFcxCur) ; /* 裝載當(dāng)前任務(wù)的 FCL 句柄到 CPU*/ _mtcr (PCX, OSTCBCur->TPcxCur) ; /* 裝載當(dāng)前任務(wù)的 PCL 句柄到 CPU*/
—mtcr (LCX, 0STCBCur->TLcx0rig) ; /* 裝載當(dāng)前任務(wù)的 LCX 鏈表句柄到 CPU*/_mtcr (PCXI, _mfcr (PCXI) & ( (uint32) (I 22))) ;/*設(shè)置PCX1. UL = O,表示當(dāng)前CSA節(jié)點(diǎn)為下部上下文節(jié)點(diǎn),PCX1. UL是TC1767芯片的PCXI寄存器的一個(gè)域,用于標(biāo)示當(dāng)前CSA節(jié)點(diǎn)為上部上下文節(jié)點(diǎn)還是下部上下文節(jié)點(diǎn)*/
—asm(〃rslcx〃);/*恢復(fù)下`部上下文*/
_mtcr (PCXI, _mfcr (PCXI) | (uint32) (3 22)) ;/*設(shè)置PCX1. UL = 1,表示當(dāng)前CSA節(jié)點(diǎn)為上部上下文節(jié)點(diǎn);設(shè)置PCX1. PIE = 1,使得RFE之后能夠使能系統(tǒng)中斷,PCX1. PIE是PCXI寄存器的一個(gè)域,作用是標(biāo)示中斷任務(wù)的中斷使能位*/
Ioinline void TaskSaveRun(TaskType PSavedTcb, TaskType PLoadTcb)
{
—asm(〃svlcx〃);/*保存下部上下文*/
0STCB01d->TFcxCur = _mfcr (FCX) ;/* 保存前一個(gè)任務(wù)的 FCL 句柄 */0STCB01d->TPcxCur = _mfcr (PCX) ;/* 保存前一個(gè)任務(wù)的 PCL 句柄 */_mtcr (FCX, OSTCBCur->TFcxCur) ; /* 裝載當(dāng)前任務(wù)的 FCL 句柄到 CPU*/ _mtcr (PCX, OSTCBCur->TPcxCur) ; /* 裝載當(dāng)前任務(wù)的 PCL 句柄到 CPU*/
—mtcr (LCX, OSTCBCur->TLcxOrig) ; /* 裝載當(dāng)前任務(wù)的 LCX 鏈表句柄到 CPU*/ _mtcr (PCXI, _mfcr (PCXI) & ( (uint32) (1 22))) ;/*設(shè)置PCXI. UL = 0, 表示當(dāng)前CSA節(jié)點(diǎn)為下部上下文節(jié)點(diǎn)*/
—asm(〃rslcx〃);/*恢復(fù)下部上下文*/
_mtcr (PCXI, _mfcr (PCXI) | (uint32) (3 22)) ;/*設(shè)置PCXI. UL = 1,表 示當(dāng)前CSA節(jié)點(diǎn)為上部上下文節(jié)點(diǎn);設(shè)置PCXI. PIE = 1,使得RFE之后能夠使能系統(tǒng)中斷 */
}o
inline void TaskLoadRun(TaskType PRunTcb)
{
—asm(〃svlcx〃);/*保存下部上下文*/
—mtcr (FCX, OSTCBCur->TFcxCur) ; /* 裝載當(dāng)前任務(wù)的 FCL 句柄到 CPU*/ —mtcr (PCX, OSTCBCur->TPcxCur) ; /* 裝載當(dāng)前任務(wù)的 PCL 句柄到 CPU*/ —mtcr (LCX, 0STCBCur->TLcx0rig) ; /* 裝載當(dāng)前任務(wù)的 LCX 鏈表句柄到 CPU*/ _mtcr (PCXI, _mfcr (PCXI) & ( (uint32) (1 22))) ;/*設(shè)置PCXI. UL = 0, 表示當(dāng)前CSA節(jié)點(diǎn)為下部上下文節(jié)點(diǎn)*/
—asm(〃rslcx〃);/*恢復(fù)下部上下文*/
_mtcr (PCXI, _mfcr (PCXI) | (uint32) (3 22)) ;/*設(shè)置PCXI. UI = 1,表 示當(dāng)前CSA節(jié)點(diǎn)為上部上下文節(jié)點(diǎn);設(shè)置PCXI. PIE = 1,使得RFE之后能夠使能系統(tǒng)中斷 */
}oinline void TaskRun(TaskType PRunTcb)
{
—asm(〃svlcx〃);/*保存下部上下文*/
—mtcr (FCX, OSTCBCur->TFcxCur) ; /*裝載當(dāng)前任務(wù)的FCL句柄到FCX寄存器
*/
—mtcr (PCX, OSTCBCur->TPcxCur) ; /*裝載當(dāng)前任務(wù)的PCL句柄到PCX寄存器
*/
—mtcr (LCX, 0STCBCur->TLcx0rig) ; /*裝載當(dāng)前任務(wù)的LCX鏈表句柄到LCX寄
存器*/
_mtcr (PCXI, _mfcr(PCXI) & C(uint32) (1 22))) ;/*設(shè)置PCXI. UL = 0, 表示當(dāng)前CSA節(jié)點(diǎn)為下部上下文節(jié)點(diǎn)*/
—asm(〃rslcx〃);/*恢復(fù)下部上下文*/
_mtcr (PCXI, _mfcr (PCXI) | (uint32) (3 22)) ;/*設(shè)置PCXI. UL = 1,表 示當(dāng)前CSA節(jié)點(diǎn)為上部上下文節(jié)點(diǎn);設(shè)置PCXI. PIE = 1,使得RFE之后能夠使能系統(tǒng)中斷 */
所述CSA鏈表的節(jié)點(diǎn)數(shù)目為預(yù)設(shè)值。其中,非IDLE任務(wù)的CSA鏈表的數(shù)目從TCBCfg中讀出,并寫入相應(yīng)任務(wù)的TCB中,其代碼如下
SET_TASK_CSA_CNT(Tcb, TcbCfg->osCsaCnt);
此外,由于IDLE任務(wù)也需要為其建立CSA鏈表,IDLE任務(wù)的CSA鏈表的節(jié)點(diǎn)數(shù)目直接在源代碼中進(jìn)行定義,其代碼如下uint80sIdleCsaCnt = 10;
在所述任務(wù)的FCL耗盡后,增加所述CSA鏈表的節(jié)點(diǎn)數(shù)目,這里增加的CSA節(jié)點(diǎn)從保留的CSA節(jié)點(diǎn)中選取??傊陨纤鰞H為本發(fā)明的較佳實(shí)施例,凡依本發(fā)明申請(qǐng)專利范圍所作的均等變化與修飾,皆應(yīng)屬本發(fā)明 專利的涵蓋范圍。
權(quán)利要求
1.一種基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,其特征在于,包括以下具體步驟為每個(gè)任務(wù)分別建立CSA鏈表,所述任務(wù)與所述CSA鏈表之間對(duì)應(yīng),所述CSA鏈表包括FCL和PCL ;切換所述CSA鏈表為當(dāng)前CSA鏈表以實(shí)現(xiàn)任務(wù)切換。
2.根據(jù)權(quán)利要求1所述的基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,其特征在于,所述為每個(gè)任務(wù)分別建立CSA鏈表的步驟在TC1767上電后,第一個(gè)任務(wù)啟動(dòng)之前立即執(zhí)行。
3.根據(jù)權(quán)利要求2所述的基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,其特征在于,在所述建立CSA鏈表的過程中,保留一定數(shù)目的節(jié)點(diǎn),所述保留的節(jié)點(diǎn)數(shù)目由SYS_START_USED 確定。
4.根據(jù)權(quán)利要求1所述的基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,其特征在于,還包括,在所述任務(wù)第一次執(zhí)行前對(duì)所述CSA鏈表進(jìn)行初始化,具體步驟為1)將所述任務(wù)的PCL的所有節(jié)點(diǎn)插入所述任務(wù)的FCL中;2)從FCL中取出兩個(gè)節(jié)點(diǎn)分別為第一節(jié)點(diǎn)和第二節(jié)點(diǎn),所述第一節(jié)點(diǎn)作為上部上下文儲(chǔ)存區(qū)域,將所述任務(wù)的堆棧指針的值寫入所述第一節(jié)點(diǎn)的SP子域,所述第二節(jié)點(diǎn)作為下部上下文儲(chǔ)存區(qū)域,將所述任務(wù)的入口地址寫入所述第二節(jié)點(diǎn)的RA子域;3)將所述第一節(jié)點(diǎn)以頭插法插入所述PCL ;4)將所述第二節(jié)點(diǎn)以頭插法插入所述PCL。
5.根據(jù)權(quán)利要求1所述的基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,其特征在于,所述CSA鏈表的節(jié)點(diǎn)數(shù)目為預(yù)設(shè)值。
6.根據(jù)權(quán)利要求1所述的基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,其特征在于,還包括,在所述任務(wù)的FCL耗盡后,增加所述CSA鏈表的節(jié)點(diǎn)數(shù)目。
7.根據(jù)權(quán)利要求1-6任一所述的基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,其特征在于,所述任務(wù)包括IDLE任務(wù)。
8.根據(jù)權(quán)利要求1-6任一所述的基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,其特征在于,所述任務(wù)的TCB包括以下成員變量TPcxCur、TFcxCur> TPcxOrig、TFcxOrig、TLcxOrig,所述成員變量用于保存所述CSA鏈表的句柄,其中,TPcxCur用于保存當(dāng)前PCL的首節(jié)點(diǎn)地址,TFcxCur用于保存當(dāng)前FCL的首節(jié)點(diǎn)地址,TPcxOrig用于保存初始PCL的首節(jié)點(diǎn)地址,TFcxOrig用于保存初始FCL的首節(jié)點(diǎn)地址,TLcxOrig用于保存初始FCL的尾節(jié)點(diǎn)地址。
全文摘要
本發(fā)明涉及微控制器的操作系統(tǒng),公開了一種基于TC1767平臺(tái)的CSA節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法,包括以下具體步驟為每個(gè)任務(wù)分別建立CSA鏈表,所述任務(wù)與所述CSA鏈表之間一一對(duì)應(yīng),所述CSA鏈表包括FCL和PCL;切換所述CSA鏈表為當(dāng)前CSA鏈表以實(shí)現(xiàn)任務(wù)切換。本發(fā)明的優(yōu)點(diǎn)在于,通過建立和引入CSA節(jié)點(diǎn)管理器,在TC1767芯片上實(shí)現(xiàn)了多任務(wù)切換和處理,任務(wù)切換迅速,具有較高的應(yīng)用價(jià)值。
文檔編號(hào)G06F9/48GK103049325SQ20131000741
公開日2013年4月17日 申請(qǐng)日期2013年1月9日 優(yōu)先權(quán)日2013年1月9日
發(fā)明者李紅, 吳朝暉, 王旭陽, 陳浩杰, 顧宗華 申請(qǐng)人:浙江大學(xué)