OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4527|回复: 1

uc/os-ii学习笔记--OSTimeDly()函数

[复制链接]

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2014-3-26 12:12:27 | 显示全部楼层 |阅读模式

本例用了BC4.5软件,在DOS环境模拟uc/os-ii
 /*本例应用程序的任务使用了延时函数OSTimeDly()进行延时。在任务MYTASK中还调用了
OSTimeDlyResume(prio)取消了任务YOUTASK的延时。为了观察任务YOUTASK的延时时间的变化*/

#include "INCLUDES.h"
#define  TASK_STK_SIZE       512       /* 任务堆栈长度*/            
INT8U x=0,y=0;
OS_EVENT *Fun_Semp;    /* 声明信号量*/
OS_STK        MyTaskStk[TASK_STK_SIZE];
OS_STK        YouTaskStk[TASK_STK_SIZE];

void  MyTask(void *data);         /* 声明任务      */
void  YouTask(void *data);
//extern  OSTimeTickHook (void);
/*
*************************************************************************
*               MAIN主函数
***************************************************************************
*/
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();      /* 启动多任务管理   */
}

void  MyTask(void *pdata)
{
 char *s_Y="Y";
#if OS_CRITICAL_METHOD == 3        /* Allocate storage for CPU status register */
    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();               /* 初始化统计任务   */
 OSTaskCreate(YouTask,s_Y, &YouTaskStk[TASK_STK_SIZE - 1], 2); /*创建任务函数,实参是Y*/
 for (;;)
    {
     if(x>20)
     {
      x=0;
      y+=2;
     }
     if(y>1) OSTimeDlyResume(2);    /*取消YOUTASK任务的延时*/
     C_DispChar(x,y,*(char *)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE); /*显示字符M */
    x+=1;
     /*如果恩下ESC键,则退出UC/OS-II*/
        if (PC_GetKey(&key) == TRUE)
        {                    
            if (key == 0x1B)
            {                           
                PC_DOSReturn();       /* Return to DOS      */
            }
        }
        OSTimeDly(100);   /* 等待100个节拍*/
    }
}

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>20)
     {
      x=0;
      y+=2;
     }
     C_DispChar(x,y,*(char *)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
     x+=1;
    OSTimeDly(500);    //等待500个时钟节拍              
    } 
}
/*
程序分析:1,MyTask任务的内容是:a),创建YouTask任务;b),每执行一次MyTask任务(显示一个字符M)就将自己挂起500个时钟节拍的时长CPU转去执行YouTask;当x>20时执行“OSTimeDlyResume(2); ”语句;即结束YouTask任务的延时进入就绪态;
2,YouTask任务的内容:每执行一次YouTask任务(显示一个字符Y)就将自己挂起500个时钟节拍的时长CPU转去执行MyTask;
3,实验现象:显示屏显示:MY M M M M MY M M M M MY M M M M MY M M M M MY MY MY MY MY
*/

手艺人要内外兼修。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-26 21:08:03 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-13 03:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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