Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1014601
  • 博文数量: 238
  • 博客积分: 2842
  • 博客等级: 少校
  • 技术积分: 2765
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-16 00:20
个人简介

stdlf

文章分类

全部博文(238)

文章存档

2013年(6)

2012年(13)

2011年(82)

2010年(89)

2009年(48)

我的朋友

分类:

2010-02-12 20:39:22

/*设计一个有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) |
给主人留下些什么吧!~~