/*设计一个有2个任务的应用程序Mytask,当程序运行后,任务的工作是:每秒在显示器上显示一串字符"M",在任务MYTASK中再建立一个任务YOUTASK,而任务YOUTASK则是在显示器上显示字符“Y”*/
----------------------------------------------------
#include "INCLUDES.h"
#define TASK_STK_SIZE 512 //任务堆栈长度
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
INT8U x=0,y=0; //字符显示位置
void MyTask(void *data); //声明任务
void YouTask(void *data);
void main (void)
{
char *s_m="M";
OSInit() //初始化uC/OS-II
PC_DOSSaveReturn(); //保存DOS环境
PC_VectSet(uCOS, OSCtxSw); // 安装uC/OS-II的中断
OSTaskCreate(MyTask,
s_m,
&MyTaskStk[TASK_STK_SIZE - 1],
0); //创建起始函数
OSStart(); //启动多任务管理
}
//STARTUP TASK
void MyTask(void *pdata)
{
char *S="Y"; //定义要显示的字符
#if OS_CRITICAL_METHOD == 3
//Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
INT16S key; //用于退出的建
pdata = pdata; //防止因定义pdata没用而报错
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); // 安装时钟中断向量
PC_SetTickRate(OS_TICKS_PER_SEC);//设置时钟频率 OS_EXIT_CRITICAL();
OSStatInit(); //初始化统计任务
OSTaskCreate(YouTask,
S,
&YouTaskStk[TASK_STK_SIZE - 1],
2); //创建任务函数
for (;;)
{
if(x>50)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
//如果恩下ESC键,则退出UC/OS-II
if (PC_GetKey(&key) == TRUE)
{
if (key == 0x1B)
{
PC_DOSReturn(); //Return to DOS
}
}
OSTimeDlyHMSM(0, 0, 3, 0);
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 //Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for (;;)
{
if(x>50)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
/*首先MyTask显示"M”再调用OSTimeDlyHMSM(0, 0, 3, 0)延时3S,调用OSTimeDlyHMSM后MayTask立即让出CPU使用权给YouTask显示第1个"Y”,由于PC_DispChar的执行时间是US级相对于延时3S时间忽略不计,显示一个"Y"后YouTask调用OSTimeDlyHMSM(0, 0, 1, 0)让出CPU使用权延时第1个1S,此1S期间MyTask和YouTask都不执行,1S过后YouTask重新获得CPU使用权再显示第2个"Y"再调用
OSTimeDlyHMSM(0, 0, 1, 0),延时第2个1S此1S期间MyTask和YouTask都不执行,1S过后YouTask重新获得CPU使用权
再显示第3个"Y",显示后再调用OSTimeDlyHMSM(0, 0, 1, 0)延时第3个1S过后,MyTask产生的3s的延时已完成,MyTask获得CPU使用权显示"M"
总的执行结果为MYYYMYYY......
且M和挨着它的那个Y几乎同时显示,后两个Y和M彼此之间显示间隔为1S
阅读(1501) | 评论(0) | 转发(0) |