| 
 ucos-ii学习笔记——首个多任务程序的创建   Created on: 2012-10-6       Author: zhang bin   学习笔记 for ucos-ii  PC redesigned by zhang bin 2012-10-6 versions:V-0.1 All Rights Reserved               #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="L";     OSInit();                                                   PC_DOSSaveReturn();                                         PC_VectSet(uCOS, OSCtxSw);                                       //创建MyTask任务     OSTaskCreate(MyTask,s_m, &MyTaskStk[TASK_STK_SIZE - 1], 0); //创建起始函数          OSStart();                                              }       void  MyTask(void *pdata) { char *S="C";           //定义要显示的字符   #if OS_CRITICAL_METHOD == 3             OS_CPU_SR  cpu_sr; #endif       INT16S        key;                  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);   // Wait 3s 把cpu的控制权交出,让任务YouTask运行         //任务MyTask调用的延迟函数,延迟函数会从就绪表中删除当前任务,该任务就不再处于就绪状态         //然后会进行一次任务调度,执行下一个优先级最高的就绪任务     } }   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>=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的使用权。而最后的任务调度就会执行下一个优先级最高的就绪任务。  
 |