Createdon:2012-10-9Author:zhangbin
本文引用地址:http://2s4d.com/article/201611/322854.htm
學(xué)習(xí)筆記
forucos-iiMC9S12XS128
redesignedbyzhangbin
2012-10-9
versions:V-0.1
AllRightsReserved
#include"includes.h"
#include"pll.h"
#include"string.h"
#defineTASK_STK_SIZE128//定義任務(wù)堆棧長度
#defineTASK_START_PRIO5//此版本的uC/OS-II最多支持256個用戶定義任務(wù)。優(yōu)先級號越低,任務(wù)的優(yōu)先級別就越高
#defineTASK_1_PRIO10
#defineTASK_2_PRIO12
#defineTASK_3_PRIO8
#defineTASK_4_PRIO16
#defineTASK_5_PRIO18
#defineTASK_6_PRIO20
#defineTASK_7_PRIO22
#defineTASK_8_PRIO24
#defineTASK_9_PRIO26
#defineTASK_A_PRIO28
#defineTASK_B_PRIO30
#defineTASK_C_PRIO32
#defineTASK_D_PRIO34
#defineTASK_E_PRIO36
#defineTASK_F_PRIO38
#defineMUTEX_PIP_18
#defineMUTEX_PIP_29
#defineEVENT_Q_1_SIZE10
#defineEVENT_Q_2_SIZE20
#defineMEM_BLKS_110
#defineMEM_BLK_SIZE_18
#defineMEM_BLKS_28
#defineMEM_BLK_SIZE_212
OS_STKled_task_1_stk[TASK_STK_SIZE];//定義任務(wù)堆棧
OS_STKled_task_2_stk[TASK_STK_SIZE];
OS_STKAppStartTaskStk[TASK_STK_SIZE];//創(chuàng)建任務(wù)堆棧OS_STK創(chuàng)建任務(wù)參數(shù)指針TASKDATA,調(diào)用函數(shù)創(chuàng)建任務(wù)
OS_STKAppTask1Stk[TASK_STK_SIZE];
OS_STKAppTask2Stk[TASK_STK_SIZE];
OS_STKAppTask3Stk[TASK_STK_SIZE];
OS_STKAppTask4Stk[TASK_STK_SIZE];
OS_STKAppTask5Stk[TASK_STK_SIZE];
OS_STKAppTask6Stk[TASK_STK_SIZE];
OS_STKAppTask7Stk[TASK_STK_SIZE];
OS_STKAppTask8Stk[TASK_STK_SIZE];
OS_STKAppTask9Stk[TASK_STK_SIZE];
OS_STKAppTaskAStk[TASK_STK_SIZE];
OS_STKAppTaskBStk[TASK_STK_SIZE];
OS_STKAppTaskCStk[TASK_STK_SIZE];
OS_STKAppTaskDStk[TASK_STK_SIZE];
OS_STKAppTaskEStk[TASK_STK_SIZE];
OS_STKAppTaskFStk[TASK_STK_SIZE];
INT16UAppTask1Ctr;
INT16UAppTask2Ctr;
INT16UAppTask3Ctr;
INT16UAppTask4Ctr;
INT16UAppTask5Ctr;
INT16UAppTask6Ctr;
INT16UAppTask7Ctr;
INT16UAppTask8Ctr;
INT16UAppTask9Ctr;
INT16UAppTaskACtr;
INT16UAppTaskBCtr;
INT16UAppTaskCCtr;
INT16UAppTaskDCtr;
INT16UAppTaskECtr;
INT16UAppTaskFCtr;
INT8Usensor=0;//定義8路傳感器采集變量
INT8Utest_value;//定義第八路傳感器故障時的變量
#ifOS_SEM_EN>0
OS_EVENT*EventSem1;
OS_EVENT*EventSem2;
#endif
#ifOS_MBOX_EN>0
OS_EVENT*EventMbox1;
OS_EVENT*EventMbox2;
#endif
#ifOS_Q_EN>0
OS_EVENT*EventQ1;
OS_EVENT*EventQ2;
void*EventQTbl1[EVENT_Q_1_SIZE];
void*EventQTbl2[EVENT_Q_2_SIZE];
#endif
#ifOS_MUTEX_EN>0
OS_EVENT*EventMutex1;
OS_EVENT*EventMutex2;
#endif
#ifOS_FLAG_EN>0
OS_FLAG_GRP*FlagGrp1;
OS_FLAG_GRP*FlagGrp2;
#endif
#ifOS_MEM_EN>0
OS_MEM*MemPart1;
OS_MEM*MemPart2;
INT8UMemPart1Tbl[MEM_BLKS_1][MEM_BLK_SIZE_1];
INT8UMemPart2Tbl[MEM_BLKS_2][MEM_BLK_SIZE_2];
#endif
//任務(wù)的函數(shù)聲明
staticvoidAppStartTask(void*pdata);
staticvoidAppTaskCreate(void);
staticvoidAppEventCreate(void);
staticvoidAppTask1(void*pdata);
staticvoidAppTask2(void*pdata);
staticvoidAppTask3(void*pdata);
staticvoidAppTask4(void*pdata);
staticvoidAppTask5(void*pdata);
staticvoidAppTask6(void*pdata);
staticvoidAppTask7(void*pdata);
staticvoidAppTask8(void*pdata);
staticvoidAppTask9(void*pdata);
staticvoidAppTaskA(void*pdata);
staticvoidAppTaskB(void*pdata);
staticvoidAppTaskC(void*pdata);
staticvoidAppTaskD(void*pdata);
staticvoidAppTaskE(void*pdata);
staticvoidAppTaskF(void*pdata);
staticvoidAppTickInit(void);
staticvoidled_task_1(void*pdata);
staticvoidled_task_2(void*pdata);
//led的初始化函數(shù)
voidled_init()
{
DDRB=0xff;//B口設(shè)為輸出
PORTB=0xff;//設(shè)為高電平,滅燈
}
voidmain(void)
{//因?yàn)闆]有外設(shè),所以不存在硬件初始化函數(shù)
INT8Uerr;
INT16UStartdata=0x1234;//開始執(zhí)行的位置另一種定義方式:TASKDATA.myPPAGE=0x1234,為結(jié)構(gòu)體變量的初始化
pllbus_init16m();//時鐘初始化為16M
//LcdInit();//LCD初始化
led_init();//led初始化
OSInit();
//創(chuàng)建起始任務(wù),作用:初始化時鐘滴答,為操作系統(tǒng)提供時鐘。初始化統(tǒng)計任務(wù),創(chuàng)建應(yīng)用任務(wù),建立事件
OSTaskCreateExt(AppStartTask,//創(chuàng)建開始任務(wù)處于休眠態(tài)的任務(wù)經(jīng)過這個函數(shù)處理后轉(zhuǎn)為就緒態(tài)
(void*)&Startdata,
(OS_STK*)&AppStartTaskStk[TASK_STK_SIZE-1],
TASK_START_PRIO,//優(yōu)先級為5
TASK_START_PRIO,
(OS_STK*)&AppStartTaskStk[0],
TASK_STK_SIZE,
(void*)0,
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
OSTaskNameSet(TASK_START_PRIO,"StartTask",&err);//設(shè)置任務(wù)的名稱作用??
OSTaskNameSet(OS_TASK_IDLE_PRIO,"uC/OS-IIIdle",&err);//空閑任務(wù)
OSTaskNameSet(OS_TASK_STAT_PRIO,"uC/OS-IIStat",&err);//統(tǒng)計任務(wù)
//#defineOS_TASK_STAT_EN1u//Enable(1)orDisable(0)thestatisticstask
//因?yàn)樵诒鞠到y(tǒng)中os_cfg_r.h文件中把OS_TASK_STAT_EN設(shè)為了1(如上),所以系統(tǒng)的統(tǒng)計任務(wù)會建立
//統(tǒng)計任務(wù)的建立是在OSInit()中被創(chuàng)建的,代碼如下:
OSStart();
}
staticvoidAppStartTask(void*pdata)
{
pdata=pdata;//pdata沒有用到,這樣的目的是防止編譯器提出warning
AppTickInit();//初始化時鐘滴答,為操作系統(tǒng)提供時鐘
OSStatInit();//初始化統(tǒng)計任務(wù)
AppTaskCreate();//創(chuàng)建應(yīng)用任務(wù)
//AppEventCreate();//建立事件
while(TRUE)//任務(wù)一般都是一個無限循環(huán)的結(jié)構(gòu)
{
OSTimeDlyHMSM(0,0,1,0);//等待1s,交出cpu,由于while無限循環(huán)中只有這一條語句,所以
//該起始任務(wù)第一次運(yùn)行以后,就一直處于掛起等待狀態(tài)
}
}
staticvoidAppTaskCreate(void)//使1-f的任務(wù)處于就緒態(tài),一旦OSstart(),優(yōu)先級最高的任務(wù)獲得CPU的使用權(quán)
{
//INT8Uerr;
OSTaskCreate(led_task_1,(void*)0,&led_task_1_stk[TASK_STK_SIZE-1],6);//創(chuàng)建任務(wù)led_task_1,優(yōu)先級為6
OSTaskCreate(led_task_2,(void*)0,&led_task_2_stk[TASK_STK_SIZE-1],7);
}
staticvoidAppEventCreate(void)
{
INT8Uerr;
#ifOS_SEM_EN>0
EventSem1=OSSemCreate(1);
OSEventNameSet(EventSem1,"Sem.#1",&err);
EventSem2=OSSemCreate(1);
OSEventNameSet(EventSem2,"Sem.#2",&err);
#endif
#ifOS_MBOX_EN>0
EventMbox1=OSMboxCreate((void*)1);
OSEventNameSet(EventMbox1,"Mailbox#1",&err);
EventMbox2=OSMboxCreate((void*)1);
OSEventNameSet(EventMbox2,"Mailbox#2",&err);
#endif
#ifOS_Q_EN>0
EventQ1=OSQCreate(&EventQTbl1[0],EVENT_Q_1_SIZE);
OSEventNameSet(EventQ1,"Queue#1",&err);
EventQ2=OSQCreate(&EventQTbl2[0],EVENT_Q_2_SIZE);
OSEventNameSet(EventQ2,"Queue#2",&err);
#endif
#ifOS_MUTEX_EN>0
EventMutex1=OSMutexCreate(MUTEX_PIP_1,&err);
OSEventNameSet(EventMutex1,"Mutex#1",&err);
EventMutex2=OSMutexCreate(MUTEX_PIP_2,&err);
OSEventNameSet(EventMutex2,"Mutex#2",&err);
#endif
#ifOS_FLAG_EN>0
FlagGrp1=OSFlagCreate(0x00FF,&err);
OSFlagNameSet(FlagGrp1,"Flag#1",&err);
FlagGrp2=OSFlagCreate(0xFF00,&err);
OSFlagNameSet(FlagGrp2,"Flag#2",&err);
#endif
#ifOS_MEM_EN>0
MemPart1=OSMemCreate(&MemPart1Tbl[0],MEM_BLKS_1,MEM_BLK_SIZE_1,&err);
OSMemNameSet(MemPart1,"Partition#1",&err);
MemPart2=OSMemCreate(&MemPart2Tbl[0],MEM_BLKS_2,MEM_BLK_SIZE_2,&err);
OSMemNameSet(MemPart2,"Partition#2",&err);
#endif
}
staticvoidled_task_1(void*pdata)//任務(wù)led_task_1的函數(shù)代碼
{
pdata=pdata;//pdata沒有用到,這樣的目的是防止編譯器提出warning
for(;;)
{
PORTB=0xf0;
OSTimeDlyHMSM(0,0,0,500);//等待1s,交出cpu,任務(wù)調(diào)度一次
}
}
staticvoidled_task_2(void*pdata)
{
pdata=pdata;//pdata沒有用到,這樣的目的是防止編譯器提出warning
for(;;)
{
PORTB=0x0f;
OSTimeDlyHMSM(0,0,1,0);//等待2s交出cpu
}
}
staticvoidAppTask1(void*pdata)
{
pdata=pdata;
for(;;)
{
Flash_Led(7,1);
OSTimeDlyHMSM(0,0,1,0);
}
}
staticvoidAppTask2(void*pdata)
{
pdata=pdata;
LcdClear();
for(;;)
{
LcdWriteStr(0,0,"illworkhard");
OSTimeDlyHMSM(0,0,1,0);
LcdClear();
LcdWriteStr(0,0,"ificangetthechance");
LcdWriteStr(1,0,"ipromisetoyou");
OSTimeDlyHMSM(0,0,1,0);
LcdClear();
}
}
staticvoidAppTask3(void*pdata)
{
pdata=pdata;
PWM_Init();//pwm初始化,將23通道級聯(lián)
LcdClear();
DDRT=0x00;//將PORTT設(shè)置為輸入
for(;;)
{
LcdWriteStr(0,0,"welcometeacher!");
PWM_Init();
PWMDuo_Dutycycle(100);
OSTimeDlyHMSM(0,0,1,0);
Close_PWM();
LcdClear();
OSTimeDlyHMSM(0,0,0,500);
}
}
staticvoidAppTask4(void*pdata)
{
INT8Uerr;
}
staticvoidAppTask5(void*pdata)
{
INT8Uerr;
DDRB_DDRB3=1;
pdata=pdata;
while(TRUE){
AppTask5Ctr++;
#ifOS_Q_EN>0
OSQPost(EventQ1,(void*)"Msg#3toQ1");
OSTimeDly(20);
OSQPost(EventQ2,(void*)"Msg#4toQ2");
#endif
OSTimeDly(40);
PORTB_PB3=~PORTB_PB3;
}
}
staticvoidAppTask6(void*pdata)
{
INT8Uerr;
char*pmsg;
chars[30];
pdata=pdata;
while(TRUE){
AppTask6Ctr++;
#ifOS_Q_EN>0
pmsg=(char*)OSQPend(EventQ1,0,&err);
strcpy(s,pmsg);
#endif
OSTimeDly(1);
}
}
staticvoidAppTask7(void*pdata)
{
INT8Uerr;
char*pmsg;
chars[30];
pdata=pdata;
while(TRUE){
AppTask7Ctr++;
#ifOS_Q_EN>0
pmsg=(char*)OSQPend(EventQ2,0,&err);
strcpy(s,pmsg);
#endif
OSTimeDly(1);
}
}
staticvoidAppTask8(void*pdata)
{
INT8Uerr;
pdata=pdata;
while(TRUE){
AppTask8Ctr++;
#ifOS_FLAG_EN>0
OSFlagPost(FlagGrp1,0x000F,OS_FLAG_SET,&err);
OSTimeDly(100);
OSFlagPost(FlagGrp1,0x00F0,OS_FLAG_SET,&err);
OSTimeDly(100);
OSFlagPost(FlagGrp1,0x0F00,OS_FLAG_SET,&err);
OSTimeDly(100);
OSFlagPost(FlagGrp1,0xF000,OS_FLAG_SET,&err);
OSTimeDly(100);
#endif
OSTimeDly(1);
}
}
staticvoidAppTask9(void*pdata)
{
INT8Uerr;
pdata=pdata;
while(TRUE){
AppTask9Ctr++;
#ifOS_FLAG_EN>0
OSFlagPend(FlagGrp1,0x00FF,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,100,&err);
#endif
OSTimeDly(100);
}
}
staticvoidAppTaskA(void*pdata)
{
INT8Uerr;
pdata=pdata;
while(TRUE){
AppTaskACtr++;
#ifOS_FLAG_EN>0
OSFlagPend(FlagGrp1,0xFF00,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,100,&err);
#endif
OSTimeDly(100);
}
}
staticvoidAppTaskB(void*pdata)
{
INT8Uerr;
pdata=pdata;
while(TRUE){
AppTaskBCtr++;
#ifOS_FLAG_EN>0
OSFlagPend(FlagGrp1,0x0FF0,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,100,&err);
#endif
OSTimeDly(100);
}
}
staticvoidAppTaskC(void*pdata)
{
INT8Uerr;
pdata=pdata;
while(TRUE){
AppTaskCCtr++;
#ifOS_MUTEX_EN>0
OSMutexPend(EventMutex1,0,&err);
OSTimeDly(100);
OSMutexPost(EventMutex1);
#endif
OSTimeDly(1);
}
}
staticvoidAppTaskD(void*pdata)
{
INT8Uerr;
pdata=pdata;
while(TRUE){
AppTaskDCtr++;
#ifOS_MUTEX_EN>0
OSMutexPend(EventMutex1,0,&err);
OSTimeDly(100);
OSMutexPost(EventMutex1);
#endif
OSTimeDly(1);
}
}
staticvoidAppTaskE(void*pdata)
{
INT8Uerr;
pdata=pdata;
while(TRUE){
AppTaskECtr++;
#ifOS_MBOX_EN>0
OSMboxPost(EventMbox1,(void*)"Msg#1");
OSTimeDly(100);
OSMboxPost(EventMbox1,(void*)"Msg#2");
OSTimeDly(100);
OSMboxPost(EventMbox1,(void*)"Msg#3");
OSTimeDly(100);
#endif
OSTimeDly(1);
}
}
staticvoidAppTaskF(void*pdata)
{
INT8Uerr;
char*pmsg;
chars[30];
pdata=pdata;
while(TRUE){
AppTaskFCtr++;
#ifOS_MBOX_EN>0
pmsg=(char*)OSMboxPend(EventMbox1,0,&err);
strcpy(s,pmsg);
#endif
OSTimeDly(1);
}
}
staticvoidAppTickInit(void)
{
TSCR1=0x80;
#ifOS_TICK_OC==0
TIOS|=0x01;
TC0=TCNT+OS_TICK_OC_CNTS;
TCTL2|=0x01;
TIE|=0x01;
#endif
#ifOS_TICK_OC==1
TIOS|=0x02;
TC1=TCNT+OS_TICK_OC_CNTS;
TCTL2|=0x04;
TIE|=0x02;
#endif
#ifOS_TICK_OC==2
TIOS|=0x04;
TC2=TCNT+OS_TICK_OC_CNTS;
TCTL2|=0x10;
TIE|=0x04;
#endif
#ifOS_TICK_OC==3
TIOS|=0x08;
TC3=TCNT+OS_TICK_OC_CNTS;
TCTL2|=0x40;
TIE|=0x08;
#endif
#ifOS_TICK_OC==4
TIOS|=0x10;
TC4=TCNT+OS_TICK_OC_CNTS;
TCTL1|=0x01;
TIE|=0x10;
#endif
#ifOS_TICK_OC==5
TIOS|=0x20;
TC5=TCNT+OS_TICK_OC_CNTS;
TCTL1|=0x04;
TIE|=0x20;
#endif
#ifOS_TICK_OC==6
TIOS|=0x40;
TC6=TCNT+OS_TICK_OC_CNTS;
TCTL1|=0x10;
TIE|=0x40;
#endif
#ifOS_TICK_OC==7
TIOS|=0x80;
TC7=TCNT+OS_TICK_OC_CNTS;
TCTL1|=0x40;
TIE|=0x80;
#endif
}
評論