ucos-ii学习笔记——首个多任务程序的创建

时间:2016-11-28来源:网络
#include"INCLUDES.h"

#defineTASK_STK_SIZE512

//定义两个任务的任务堆栈,每一个任务有一个任务堆栈

OS_STKMyTaskStk[TASK_STK_SIZE];

OS_STKYouTaskStk[TASK_STK_SIZE];

INT8Ux=0,y=0;//字符显示位置

//声明两个任务函数

voidMyTask(void*data);

voidYouTask(void*data);

voidmain(void)

{

char*s_m="L";

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS,OSCtxSw);

//创建MyTask任务

OSTaskCreate(MyTask,s_m,&MyTaskStk[TASK_STK_SIZE-1],0);//创建起始函数

OSStart();

}

voidMyTask(void*pdata)

{

char*S="C";//定义要显示的字符

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

INT16Skey;

pdata=pdata;

OS_ENTER_CRITICAL();

PC_VectSet(0x08,OSTickISR);

PC_SetTickRate(OS_TICKS_PER_SEC);

OS_EXIT_CRITICAL();

OSStatInit();

//在Mytask中创建任务YouTask

OSTaskCreate(YouTask,S,&YouTaskStk[TASK_STK_SIZE-1],2);//创建任务函数

//其实在这里创建任务YouTask,也会执行一次任务的调度,只不过YouTask的优先级没有MyTask的高,所以

//继续执行任务MyTask,详细说明请参见P119

for(;;)

{

if(x>=4)//每行显示4个字符

{

x=0;

y+=2;

}

PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);//显示L

x+=1;

//如果恩下ESC键,则退出UC/OS-II

if(PC_GetKey(&key)==TRUE)

{

if(key==0x1B)

{

PC_DOSReturn();

}

}

OSTimeDlyHMSM(0,0,3,0);//Wait3s把cpu的控制权交出,让任务YouTask运行

//任务MyTask调用的延迟函数,延迟函数会从就绪表中删除当前任务,该任务就不再处于就绪状态

//然后会进行一次任务调度,执行下一个优先级最高的就绪任务

}

}

voidYouTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3//AllocatestorageforCPUstatusregister

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

if(x>=4)

{

x=0;

y+=2;

}

PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);

x+=1;

OSTimeDlyHMSM(0,0,1,0);//等待1s,交出cpu的控制权,让任务Mytask运行

}

}

//因为MyTask的等待时间为3s,YouTask的等待时间为1s,所以MyTask每执行一次,YouTask执行3次

//程序运行的效果为每显示一个L,显示3个C

//因为在MyTask显示完L后就交出了cpu,所以YouTask会立马执行,显示一个C,所以看到的效果相当于L和第一个C同时显示

//以后两个C的显示间隔1s

//按时,分,秒,毫秒延时函数OSTimeDlyHMSM();实质上是调用了任务节拍延时函数,OSTimeDly();

//延时函数OSTimeDly();以时钟节拍数进行延时,在函数中,调用了OSSched();任务调度。

//因为在函数中,首先从就绪表中删除当前任务,最后再进行任务的调度。所以当任务调用了延迟函数后,那么该

//任务就处于等待状态了,交出了cpu的使用权。而最后的任务调度就会执行下一个优先级最高的就绪任务。

//详细请参见P145

关键词: ucos-ii学习笔记多任务程

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版