新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 在MC68HC908GP32上移植μC/OS-II

在MC68HC908GP32上移植μC/OS-II

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

4.OS_CPU08.C文件

本文引用地址:http://www.2s4d.com/article/201609/305220.htm

μC/OS-II的移植需要用戶在OS_CPU08.C中定義6個(gè)函數(shù):

OSTaskStkInit()

OSTaskCreateHook()

OSTaskDelHook()

OSTaskSwHook()

OSTaskStatHook()

OSTimeTickHook()

實(shí)際需要定義的只有OSTaskStkInit()函數(shù),其他5個(gè)函數(shù)需要聲明,但不一定有實(shí)際內(nèi)容。這5個(gè)函數(shù)都是用戶定義,所以O(shè)S_CPU08.C中只有定義,沒有給出代碼。如果用戶需要使用這些函數(shù),請(qǐng)將文件OS_CFG.H中的#define constant OS_CPU_HOOKS_EN設(shè)為1,設(shè)為0表示不使用這些函數(shù)。

OSTaskStkInit()函數(shù)由任務(wù)創(chuàng)建函數(shù) OSTaskCreate()或OSTaskCreateExt()調(diào)用,用來(lái)初始化任務(wù)的堆棧。初始狀態(tài)的堆棧模擬發(fā)生一次中斷后的堆棧結(jié)構(gòu),按照中斷后的進(jìn)棧次序預(yù)留各個(gè)寄存器存儲(chǔ)空間;而中斷返回地址指向任務(wù)代碼的起始地址。當(dāng)調(diào)用OSTaskCreate()或OSTaskCreateExt()創(chuàng)建一個(gè)新任務(wù)時(shí),需要傳遞的參數(shù)是:任務(wù)代碼的起始地址、參數(shù)指針(pdata)、任務(wù)堆棧頂端的地址、任務(wù)的優(yōu)先級(jí)。 OSTaskCreateExt()還需要一些其他參數(shù),但與OSTaskStkinit()沒有關(guān)系。OSTaskStkInit()只需要以上提到的 3個(gè)參數(shù)(task、pdata和ptos)。堆棧初始化工作結(jié)束后,OSTaskStkInit()返回新的堆棧棧頂指針,OSTaskCreate()OSTaskCreateExt()將指針保存在任務(wù)的OS_TCB中。

Void*OSTaskStklint(void(*task)(void*pd),void*pdata,void*ptos,INT16U opt)

{

INT16U *stk;

stk=(INT16U*)ptos; /*保存堆棧指針*/

*--stk=(INT16U)(task); /保存程序計(jì)數(shù)器內(nèi)容*/

*--stk=(INT16U)(0x00); /初始化X和A寄存器內(nèi)容*/

--stk=(INT16U)(0x00); /*初始化CCR和H寄存器*/

return((void*)stk);

}

其余的幾個(gè)函數(shù):OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook和OSTimeTickHook()均由用戶自定義。

四、制作用戶自己的項(xiàng)目

在為內(nèi)核編寫了上述與硬件相關(guān)的代碼以后,用戶就可以為自己的項(xiàng)目編寫實(shí)際的代碼了。在本例中,用戶任務(wù)共有兩個(gè)。任務(wù)1在初始化時(shí)鐘中斷以后,就進(jìn)入了一人死循環(huán)。在這個(gè)循環(huán)里,任務(wù)1一方面以1s(秒)為周期改變并行I/O口 PORTA第0個(gè)引腳的輸出電壓,另一方面每隔4s便向任務(wù)2發(fā)送1個(gè)信號(hào)。而任務(wù)2則始終等待任務(wù)1發(fā)來(lái)的信號(hào),一旦收到信號(hào),便改變并行I/O口 PORTA第1個(gè)引腳的輸出電壓。具體的代碼如下:

/*****************************************

* EXE2.C

*******************************************/

#include

#include includes.h

Byte PORTA @0x0000; /*并口A地址$0000*/

Byte DDRA @0x0004; /*并口A方向寄存器地址$0004*/

Byte T1SC @0x0020; /*定時(shí)器控制寄存器地址$0020*/

Byte T1MODH@0x0023; /*定時(shí)器模式寄存器地址$0023*/

OS_EVENT *Semaphore;

#define TASK_STK_SIZE 64 /*任務(wù)堆棧大小64字節(jié)*/

INT8U Task1Stk[TASK_STK_SIZE]; /*定義任務(wù)1堆棧*/

INT8U Task2Stk[TASK_STK_SIZE]; /*定義任務(wù)2堆棧*/

Void Hardwareinit(void);

Void Task1(void*pdata)

{int count=0;

/*int count=0;

/*初始化定時(shí)器*/

asm{

LDA #0x50

STA T1SC

LDHX #0x0333 //設(shè)定定時(shí)器間隔100ms

STHX T1MODH

CLI

}

for(;;){

PORTA=0xFE;

OSTimeDly(5); /*延時(shí)0.5s*/

PORTA|=0x01;

/*延時(shí)0.5s*/

DSTimeDly(5);

Count++;

If(count= =4){

OSSemPost(Semaphore);

Count=0;

}

}}

void Task2(void *pdata)

{

Byte err;

For(;;){

OSSemPend(Semaphore,0,err);

PORTA=0xFD:

OSSemPend(Semaphore,0,err);

PORTA|=0x02;

}

}

void main(void){

Hardwarelnit(); /*完成硬件的初始化工作*/

Oslint(); /*初始化多任務(wù)環(huán)境*/

Semaphore=OSSemCreate(0);

OSTaskCreate(Task1,(void*)0,(void*)Task1Stk

[TASK_STK_SIZE],10);

OSTaskCreate(Task2,void*)0,(void*)Task2Stk

[TASK_STK_SIZE],9);

OSStart();

}

在主程序main()中,用戶必須先調(diào)用OSInit(),然后創(chuàng)建各個(gè)任務(wù)和信號(hào)量等,最后調(diào)用OSStart(),以啟動(dòng)內(nèi)核運(yùn)行,開始正常的任務(wù)調(diào)度。

本例中盡量減小了對(duì)RAM的需求:假如中斷嵌套層數(shù)不超過(guò)三層,所需事件只有一個(gè),即只需要一個(gè)事件控制塊;應(yīng)用中對(duì)μC/OS-II提供的功能進(jìn)行最大限度的裁剪,能不用的盡量不用。采用了上述措施后,μC/OS-II的RAM使用情況大致如下:μC/OC-II所使用的全局變量占用22字節(jié),事件控制塊占用12字節(jié)。此外,當(dāng)系統(tǒng)初始化時(shí),還需要最小30字節(jié)的系統(tǒng)堆棧用于初始化TCB,并傳遞參數(shù)。以上為μC/OS-II中系統(tǒng)所必需的RAM,計(jì)64字節(jié)。

假設(shè)給每個(gè)任務(wù)分配64個(gè)字節(jié)的堆棧空間,其中用于任務(wù)控制塊17字節(jié),允許三層中斷嵌套要用18字節(jié),任務(wù)切換時(shí)的棧結(jié)構(gòu)要用8字節(jié)。由于程序是用C語(yǔ)言編寫的,確切的子函數(shù)嵌套調(diào)用層數(shù)是不知道的。如果不使用本身需要緩沖區(qū)的C 語(yǔ)言函數(shù),如printf()等,任務(wù)中程序調(diào)用所產(chǎn)生的嵌套層數(shù)不超過(guò)10層,則64字節(jié)中還能分析給任務(wù)局部變量的空間只剩下1字節(jié)了。這是能分配任務(wù)的最小RAM空間了。

綜上所述,GP32的512字節(jié)RAM可分為8個(gè)64字節(jié)的RAM塊。如果運(yùn)行 4個(gè)任務(wù),能留給應(yīng)用程序的RAM也只剩下128字節(jié)了。如果在GP32上運(yùn)行μC/OS-II,且不多于8個(gè)任務(wù),則任務(wù)調(diào)度表可以再簡(jiǎn)化,不需要調(diào)度 64個(gè)任務(wù),只調(diào)度8個(gè)任務(wù)就可以了。


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞:

評(píng)論


相關(guān)推薦

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

關(guān)閉