新聞中心

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

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

作者: 時(shí)間:2009-03-19 來(lái)源:網(wǎng)絡(luò) 收藏

2.2 內(nèi)核的

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

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

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

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

2.3 實(shí)時(shí)內(nèi)核在中應(yīng)注意的問(wèn)題

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

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

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

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

2.4 應(yīng)用μ實(shí)時(shí)內(nèi)核的主要部分

(1)任務(wù)的分配

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

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

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

(3)任務(wù)間的通信

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

?關(guān)中斷;

?使用測(cè)試并置位;

?禁止任務(wù)切換;

?利用信號(hào)量。

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

void Function(void)

{

OS_ENTER_CRITICAL();

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

OS_EXIT_CRITICAL();

}

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

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

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

Set variable to 1; /*置資源不可用,標(biāo)志為1*/

Reenable interrupts; /*重開(kāi)中斷*/

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

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

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

Reenable interrupts; /*重新開(kāi)中斷*/

}else { /*否則*/

Reenable interrupts; /*開(kāi)中斷*/

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

}

(4)時(shí)鐘節(jié)拍



評(píng)論


相關(guān)推薦

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

關(guān)閉