国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      基于tc1767平臺(tái)的csa節(jié)點(diǎn)管理器的實(shí)現(xiàn)方法

      文檔序號(hào):6397611閱讀:792來源:國(guó)知局
      專利名稱:基于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é)
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1