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

本文介绍了使用ucos-ii操作系统创建并调度多任务程序的过程,包括任务堆栈定义、任务函数声明、任务创建与调度等关键步骤。通过实例展示了如何在任务间交替执行,实现特定的交互与功能演示。

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

(2012-10-06 12:18:59)
转载

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 ==        

    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 ==        //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的使用权。而最后的任务调度就会执行下一个优先级最高的就绪任务。

//详细请参见P145

分享:

6

喜欢

0

赠金笔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值