新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ucos-ii学习笔记——s12移植成功main函数

ucos-ii学习笔记——s12移植成功main函数

作者:时间:2016-11-28来源:网络收藏
Createdon:2012-10-9

Author:zhangbin

本文引用地址:http://www.eepw.com.cn/article/201611/322854.htm

学习笔记

forucos-iiMC9S12XS128

redesignedbyzhangbin

2012-10-9

versions:V-0.1

AllRightsReserved

#include"includes.h"

#include"pll.h"

#include"string.h"

#defineTASK_STK_SIZE128//定义任务堆栈长度

#defineTASK_START_PRIO5//此版本的uC/OS-II最多支持256个用户定义任务。优先级号越低,任务的优先级别就越高

#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];//定义任务堆栈

OS_STKled_task_2_stk[TASK_STK_SIZE];

OS_STKAppStartTaskStk[TASK_STK_SIZE];//创建任务堆栈OS_STK创建任务参数指针TASKDATA,调用函数创建任务

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

//任务的函数声明

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的初始化函数

voidled_init()

{

DDRB=0xff;//B口设为输出

PORTB=0xff;//设为高电平,灭灯

}

voidmain(void)

{//因为没有外设,所以不存在硬件初始化函数

INT8Uerr;

INT16UStartdata=0x1234;//开始执行的位置另一种定义方式:TASKDATA.myPPAGE=0x1234,为结构体变量的初始化

pllbus_init16m();//时钟初始化为16M

//LcdInit();//LCD初始化

led_init();//led初始化

OSInit();

//创建起始任务,作用:初始化时钟滴答,为操作系统提供时钟。初始化统计任务,创建应用任务,建立事件

OSTaskCreateExt(AppStartTask,//创建开始任务处于休眠态的任务经过这个函数处理后转为就绪态

(void*)&Startdata,

(OS_STK*)&AppStartTaskStk[TASK_STK_SIZE-1],

TASK_START_PRIO,//优先级为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);//设置任务的名称作用??

OSTaskNameSet(OS_TASK_IDLE_PRIO,"uC/OS-IIIdle",&err);//空闲任务

OSTaskNameSet(OS_TASK_STAT_PRIO,"uC/OS-IIStat",&err);//统计任务

//#defineOS_TASK_STAT_EN1u//Enable(1)orDisable(0)thestatisticstask

//因为在本系统中os_cfg_r.h文件中把OS_TASK_STAT_EN设为了1(如上),所以系统的统计任务会建立

//统计任务的建立是在OSInit()中被创建的,代码如下:

OSStart();

}

staticvoidAppStartTask(void*pdata)

{

pdata=pdata;//pdata没有用到,这样的目的是防止编译器提出warning

AppTickInit();//初始化时钟滴答,为操作系统提供时钟

OSStatInit();//初始化统计任务

AppTaskCreate();//创建应用任务

//AppEventCreate();//建立事件

while(TRUE)//任务一般都是一个无限循环的结构

{

OSTimeDlyHMSM(0,0,1,0);//等待1s,交出cpu,由于while无限循环中只有这一条语句,所以

//该起始任务第一次运行以后,就一直处于挂起等待状态

}

}

staticvoidAppTaskCreate(void)//使1-f的任务处于就绪态,一旦OSstart(),优先级最高的任务获得CPU的使用权

{

//INT8Uerr;

OSTaskCreate(led_task_1,(void*)0,&led_task_1_stk[TASK_STK_SIZE-1],6);//创建任务led_task_1,优先级为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)//任务led_task_1的函数代码

{

pdata=pdata;//pdata没有用到,这样的目的是防止编译器提出warning

for(;;)

{

PORTB=0xf0;

OSTimeDlyHMSM(0,0,0,500);//等待1s,交出cpu,任务调度一次

}

}

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通道级联

LcdClear();

DDRT=0x00;//将PORTT设置为输入

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

}



评论


相关推荐

技术专区

关闭