查看: 1434|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-13 20:59:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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的等待时间为3sYouTask的等待时间为1s,所以MyTask每执行一次,YouTask执行3

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

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

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

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

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

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

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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表