<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > μC/OS-II在總線式數(shù)據(jù)采集系統(tǒng)中的應用

          μC/OS-II在總線式數(shù)據(jù)采集系統(tǒng)中的應用

          作者: 時間:2009-03-19 來源:網(wǎng)絡 收藏

          2.2 內(nèi)核的

          內(nèi)核的也就是使實時內(nèi)核能夠在某個微處理器或微控制器上正常運行。工作包括以下幾個內(nèi)容:

          (1)在OS_CPU.H中用#define定義三個宏,聲明C96中能夠識別的數(shù)據(jù)類型和堆棧的增長方向。

          (2)在OS_CPU.C中用C語言重新編寫以下幾個函數(shù):OSTaskStkInit、OSStartHighRdy、OSTaskCreateHook、OSTaskSwHook、OSTaskDelHook、OSTaskStatHook、OSTimeTickHook。

          (3)在OS_CPU.ASM中編寫幾個匯編語言函數(shù)LoadCtx()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。

          2.3 實時內(nèi)核在中應注意的問題

          一個實時的軟件由實時操作加上程序構(gòu)成。程序與操作的接口通過系統(tǒng)調(diào)用來實現(xiàn)。用80C196KB作為系統(tǒng)的MCU,只能用內(nèi)部RAM作為TCB和所有系統(tǒng)存儲器(含各種控制表)以及各個任務的工作和數(shù)據(jù)單元。因此一定要注意以下幾點:

          (1)為各個任務分配各自的堆棧區(qū),該堆棧區(qū)既作為任務的工作單元,也作為任務控制塊的保護單元。

          (2)系統(tǒng)的任務控制塊只存放各任務的堆棧指針,而任務的狀態(tài)均存放于任務堆棧中。在一個任務退出運行時,通過中斷把它的狀態(tài)進棧,然后把它的堆棧指針保存于系統(tǒng)的TCB中;再根據(jù)優(yōu)先級取出優(yōu)先級最高的已就緒任務的堆棧指針SP映象值送入SP中;最后執(zhí)行中斷返回指令轉(zhuǎn)去執(zhí)行新任務。

          (3)各任務的數(shù)據(jù)和工作單元盡量用堆棧實現(xiàn),這樣可以允許各任務使用同一個子程序。使用堆棧實現(xiàn)參數(shù)傳遞并作為工作單元,而不使用絕對地址的RAM,可實現(xiàn)可重入子程序。該子程序既可為各個任務所調(diào)用,也可以實現(xiàn)遞歸調(diào)用。

          2.4 應用μ實時內(nèi)核的主要部分

          (1)任務的分配

          實時系統(tǒng)中的任務有別于中的子程序模塊,任務是處理機按程序處理數(shù)據(jù)的過程,是個動態(tài)的概念。一般一個任務對應于一段獨立的主程序,它可能調(diào)用各種子程序,并使用各種系統(tǒng)資源如中斷、外設(shè)等,以完成某種選定的功能,且允許多個任務并行。根據(jù)該系統(tǒng)的性能指標和技術(shù)要求,可對系統(tǒng)進行如下的任務劃分:按鍵中斷、LCD顯示、串行通信、打印與報警、信道巡檢A/D采樣與數(shù)據(jù)處理、系統(tǒng)信息顯示、系統(tǒng)工作參數(shù)測量、電源切換與充電管理共八個任務。

          (2)任務的調(diào)度

          μ的任務調(diào)度是按優(yōu)先級進行的,根據(jù)各任務的實時性要求及重要程度,分別置它們的優(yōu)先級為4、9、8、7、6、11、10、5。其中0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO這幾個優(yōu)先級保留以被系統(tǒng)使用。優(yōu)先級號越低,任務的優(yōu)先級越高。這樣程序之間的通信可以通過按鍵中斷置標志來實現(xiàn),其中按鍵中斷的優(yōu)先級最高。當其它任務運行時,按鍵中斷將使得系統(tǒng)服務轉(zhuǎn)向運行按鍵中斷處理子程序ISR。當中斷處理子程序運行完后,轉(zhuǎn)向判斷就緒狀態(tài)任務的優(yōu)先級別。如果發(fā)現(xiàn)有比中斷前任務優(yōu)先級更高的任務,則轉(zhuǎn)向執(zhí)行該任務。先判斷其運行標志,如果是‘非’,則又等待。再重復上述過程。如果在執(zhí)行完ISR后發(fā)現(xiàn)沒有比中斷前任務優(yōu)先級更高的,則轉(zhuǎn)向中斷前的子程序繼續(xù)運行。該系統(tǒng)的軟件處理沒有采用優(yōu)先級轉(zhuǎn)換的方法,而是采用狀態(tài)置位判斷的方法,這樣可以減少程序的復雜性。

          (3)任務間的通信

          任務間通信最簡便的方法是使用共享數(shù)據(jù)結(jié)構(gòu)。雖然共享數(shù)據(jù)區(qū)法簡化了任務間的信息交換,但是必須保證每個任務在處理共享數(shù)據(jù)時的排它性,以避免競爭和數(shù)據(jù)的破壞。通常與共享資源打交道時,使之滿足互斥條件最一般的方法有以下幾種:

          ?關(guān)中斷;

          ?使用測試并置位;

          ?禁止任務切換;

          ?利用信號量。

          在本系統(tǒng)中采用了前兩種。關(guān)中斷是一種最簡單快捷的方式,也是在中斷服務子程序中處理共享數(shù)據(jù)結(jié)構(gòu)的唯一方法。要注意的是:關(guān)中斷的時間要盡量短,以免影響操作系統(tǒng)的中斷處理。其應用模式如下:

          void Function(void)

          {

          OS_ENTER_CRITICAL();

          …… /*在此處理共享數(shù)據(jù)*/

          OS_EXIT_CRITICAL();

          }

          測試并置位方式需要有一個全局變量,約定好先測試該變量;如果是約定的數(shù)值,則執(zhí)行該任務,否則不執(zhí)行該任務。這種方法稱測試并置位(TEST-AND-SET),或TAS。其應用程序如下:

          Disable interrupts /*關(guān)中斷*/

          If ('Access Variable' is 0){ /*若資源不可用,標志為0*/

          Set variable to 1; /*置資源不可用,標志為1*/

          Reenable interrupts; /*重開中斷*/

          Access the resource; /*處理該資源*/

          Disable interrupts; /*關(guān)中斷*/

          Set the 'Access Variable' back to 0;/*清資源不可使用,標志為0*/

          Reenable interrupts; /*重新開中斷*/

          }else { /*否則*/

          Reenable interrupts; /*開中斷*/

          /*資源不可使用,以后再試*/

          }

          (4)時鐘節(jié)拍



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();