3.1 OS_CPU.H文件的修改
(1)C
#define OS_STK_ GROWTH 1
(2)定義相關(guān)宏。C
#define OS_ENTER_CRITICAL EA =0
#define OS_EXIT_CRITICAL EA =1
任務(wù)切換宏封裝了對任務(wù)切換函數(shù)OSCtxSw()的調(diào)用,定義如下:
#define OS_TASK_SW OSCtxSw()
(3)數(shù)據(jù)類型的定義。根據(jù)C
3.2 OS_CPU.C文件的修改
(1)添加系統(tǒng)時鐘初始化程序
C
void InitTimer0(void) reentrant
{SFRPAGE =0x00;//切換寄存器頁
TMOD =TMOD&0xF0;
TMOD=TMOD | 0x01;//模式1(16位定時器),僅受TR0控制
TH0=0x70; //定義Tick=50次/秒(即0.02秒/次)
TL0=0x00;
ET0=1;//允許T0中斷
TR0=1;
}
(2)任務(wù)堆棧初始化函數(shù)的改寫
任務(wù)堆??臻g由高至低依次將保存著PSW,ACC,B,DPL,DPH等寄存器。為了使任務(wù)的調(diào)度一致,初始狀態(tài)的堆棧實際上是模擬了一次中斷發(fā)生后的堆棧結(jié)構(gòu),以便在OSSched()進(jìn)行任務(wù)調(diào)度時,從堆棧中恢復(fù)剛開始運(yùn)行時的處理器現(xiàn)場。當(dāng)前任務(wù)堆棧初始化完成后,OSTaskStklnit返回新的堆棧指針stk,在OSTaskCreate()執(zhí)行時將調(diào)用OS_TaskStkInit的初始化過程,然后再通過調(diào)用OSTCBInit()將返回的sp指針保存到該任務(wù)的TCB塊中。
3.3 OS_CPU.ASM文件的修改
OS_CPU.ASM文件是用匯編語言編寫的模塊,包括大量對處理器寄存器的讀寫操作,其中主要由4個匯編語言函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()組成,每一個函數(shù)都需要用PUBLIC聲明為可以被外部模塊調(diào)用。
uCOS II任務(wù)的切換,系統(tǒng)寄存器需要頻繁完成進(jìn)棧和出棧操作,為了減少代碼編寫工作量,在OS_CPU.ASM中根據(jù)芯片特點(diǎn)將寄存器的進(jìn)棧出棧操作定義為宏。
3.4 數(shù)據(jù)采集任務(wù)的實現(xiàn)(自己功能的實現(xiàn))
為了提高數(shù)據(jù)采集實時性和可靠性,對每個模擬量數(shù)據(jù),uCOS II采用單獨(dú)的任務(wù)來實現(xiàn)。下面給出溫度和壓力數(shù)據(jù)采集的實現(xiàn)程序。溫度數(shù)據(jù)采集任務(wù)程序:
void Task1(void *pada)
{
mux_select = MUX_CPU_TEMP;//溫度數(shù)據(jù)測量
StartCollect();
For(;;)
{read_TEMP_inputs();//數(shù)據(jù)讀入,標(biāo)度轉(zhuǎn)換
temp_long=ADC0 - 42380/2;
temp_long= (temp_long*
cpu_temperature=temp_long;
……
OSTimeDly(OS_TICKS_PER_SEC);//任務(wù)調(diào)度
}
}
壓力數(shù)據(jù)采集任務(wù)程序:
void Task2(void *pada)
{
mux_select = MUX_CPU_PRESS;//溫度數(shù)據(jù)測量
StartCollect();// start the collecting
For(;;)
{read_Press_inputs();
press_long= ADC0;
press_long= temp_ long;
……
OSTimeDly(OS_TICKS_PER_SEC);//任務(wù)調(diào)度
}
}