4803|7

78

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

uCOS-II 新手入门级求助 [复制链接]

 做任哲老师的例3.7时遇到了问题,请大家帮忙解答。

/******************************Test*******************************/
#include "includes.h"
#define  TASK_STK_SIZE   512                        //任务堆栈长度
OS_STK   MyTaskStk[TASK_STK_SIZE];                //定义任务堆栈区
OS_STK   YouTaskStk[TASK_STK_SIZE];                //定义任务堆栈区
INT16S   key;                                                                //用于退出uCOS_II的键
INT8U         x=0,y=0;                                                        //字符显示位置
void  MyTask(void *data);                                                //声明任务
void  YouTask(void *data);                                                //声明任务
/************************主函数*********************************/
void  main (void)
{
      char* s_M="M";                                                        //定义要显示的字符
    OSInit( );                                                                //初始化uCOS_II
      PC_DOSSaveReturn( );                                                //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);                                                //安装uCOS_II中断
    OSTaskCreate(                     
                                      MyTask,                                   //创建任务MyTask
                        s_M,                                        //给任务传递参数
                     &MyTaskStk[TASK_STK_SIZE - 1],              //设置任务堆栈栈顶指针
                     0                                //任务的优先级别为0
                );                               
    OSStart( );                                                                        //启动多任务管理
}

/*******************任务MyTask**********************************/

void  MyTask (void *pdata)
{
    char* s_Y="Y";                                //定义要显示的字符
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata;
    OS_ENTER_CRITICAL( );
    PC_VectSet(0x08, OSTickISR);                //安装时钟中断向量
    PC_SetTickRate(OS_TICKS_PER_SEC);        //设置时钟频率
    OS_EXIT_CRITICAL( );
    OSStatInit( );                                //初始化统计任务
    OSTaskCreate(
                 YouTask,                                        //创建任务MyTask
                 s_Y,                                //给任务传递参数
                 &YouTaskStk[TASK_STK_SIZE - 1],        //设置任务堆栈栈顶指针
                 2                                        // MyTask的优先级别为2
                  );                               
    for (;;)
    {
        if (x>50)
        {
        x=0;
        y+=2;
         }                                                
        PC_DispChar(x, y, *(char*)pdata, DISP_BGND_BLACK+DISP_FGND_WHITE );
       x += 1;   
      //如果按下Esc键则退出uCOS_II
      if (PC_GetKey(&key) == TRUE)
      {
                if (key == 0x1B)
        {
                       PC_DOSReturn( );                                //恢复Dos环境
                }
       }
      OSTimeDlyHMSM(0, 0, 3, 0);                                //等待3秒
    }
}

/************************任务YouTask******************************/

void  YouTask (void *pdata)
{
                #if OS_CRITICAL_METHOD == 3
        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);                //等待1秒
    }
}

/************************End************************************/
我想问的是“MyTask”任务执行到到哪开始执行“YouTask”,为什么同时显示“MY”,隔一秒显示一个“Y”,再隔一秒显示一个“Y”,隔一秒显示“MY”,往复循环。我知道在 “MyTask”任务里延时了3秒,在这段时间里正好有3个“Y”输出,因为“MyTask”任务的优先级要高所以有切换到“MyTask”任务。可是为什么会同时显示“M”和“Y”呢,“MyTask”任务执行到到哪开始执行“YouTask”呢??
思想体会的不到位,请高手指点一下。

最新回复

我也在在任哲的那本,多看多想,动手还没有。 如果你能够硬着头皮看三遍,我觉得应该就明白了。  详情 回复 发表于 2012-6-29 15:43
点赞 关注
 

回复
举报

130

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我也刚学,也有这方面的疑问。还是等高手进来帮你回答吧。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
我把 “MyTask”任务里延时3秒,改成延时一秒。输出就变成了总是输出"MY",是不是代表这两个任务同时进行了呢??唉,头都大了。"YouTask“这个任务是何时启动的啊?
 
 
 

回复

463

帖子

0

TA的资源

纯净的硅(中级)

4
 

回复 楼主 fendou 的帖子

如果要理解这个问题,需要先理解几个概念

任务执行时间Trun_Task :任务代码的执行时间,如果任务设计较好的话这个时间一般很短。ms级

任务等待时间Twait_Task:这个时间一般是任务消耗的主要时间,但是在这个时间任务并没有占用CPU的使用权而是处于休眠或挂起状态

任务调度时间T_Task      :这个时间是任务的总的调度时间,任务在这个时间片长度上会执行一次。即 T_Task  = Trun_Task + Twait_Task。 

 

在你的问题中Trun_MyTask和Trun_YouTask时间很短(ns级)可以近似为0。所以我们可以近似的认为T_Task  = Twait_Task

 

这样当MyTask执行时,很短的时间输出‘M’,然后进入3秒的延时,在进入延时的开始任务执行调度,YouTask运行,输出‘Y’。由于Trun_MyTask近似为0,

所以看起来好像MyTask和YouTask同时执行一样,接着每隔1秒YouTask都输出一个‘Y’。共3个Y后MyTask运行,输出“M”。依次类推

[ 本帖最后由 wstrom 于 2011-11-11 13:51 编辑 ]

任务执行时间.bmp (972.05 KB, 下载次数: 0)

任务执行时间.bmp
 
 
 

回复

463

帖子

0

TA的资源

纯净的硅(中级)

5
 

回复 楼主 fendou 的帖子

如果理解了希望你把这个问题整理一下放到UCOS-有问必答那个帖子
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(高级)

6
 
谢谢版主,我明白了。也已经放到UCOS-有问必答帖子里了。
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

7
 
:rose:
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(高级)

8
 

应该多看多想

我也在在任哲的那本,多看多想,动手还没有。
如果你能够硬着头皮看三遍,我觉得应该就明白了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表