搜索
bottom↓
回复: 3

任哲老师ucos ii书上的一个问题

[复制链接]

出0入0汤圆

发表于 2013-6-17 20:34:51 | 显示全部楼层 |阅读模式
正在学习任哲老师的书,做实验的时候遇到了两个问题(可能编辑的不太好,程序有些长,不好意思):
        1)这是其中一个任务,请问当我调用下面那个延时3s的程序的时候,那个检测当前按键是不是esc的程序还在执行吗?
void  MyTask (void *pdata)
{

                //如果按下Esc键则退出uCOS_II
                if (PC_GetKey(&key) == TRUE)
                {
            if (key == 0x1B)
            {
                PC_DOSReturn();
            }
                 }
        OSTimeDlyHMSM(0, 0, 3, 0);        //等待
}
            2)下面是完整的程序和实验的结果但是为什么这一堆m是一起出来的?怎么没有3s延时了?


#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;                                                //字符显示位置
INT8U    times;

void  MyTask(void *data);                                //声明一个任务
void  YouTask(void *data);


/************************主函数*********************************************/

void  main (void)
{
    char* s="M";                                                //定义要显示的字符

    OSInit();                                                        //初始化uCOS_II

    PC_DOSSaveReturn();                                        //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);                        //安装uCOS_II中断

    OSTaskCreate(MyTask,                                //创建任务MyTask
                s,                                                                //给任务传递参数
                &MyTaskStk[TASK_STK_SIZE - 1],        //设置任务堆栈栈顶指针
                0);                                                                //使任务MyTask的优先级别为0
    OSStart();                                                        //启动uCOS_II的多任务管理
}


void  MyTask (void *pdata)
{
        char* m = "Y" ;

        #if OS_CRITICAL_METHOD == 3
                OS_CPU_SR  cpu_sr;
        #endif

    pdata = pdata;

    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);                        //安装uCOS_II时钟中断向量
    PC_SetTickRate(OS_TICKS_PER_SEC);                //设置uCOS_II时钟频率
    OS_EXIT_CRITICAL();

    OSStatInit();                                                        //初始化uCOS_II的统计任务

        OSTaskCreate(YouTask,                                        //创建任务YouTask
                m,                                                                        //给任务传递参数
                &YouTaskStk[TASK_STK_SIZE - 1],                //设置任务堆栈栈顶指针
                2);

    for (;;)
        {   
                if (times == 10)
                {
                        OSSchedLock();
                }

                if (times == 80)
                {
                        OSSchedUnlock();
                }

                times += 1 ;

        if (x>10)
                {
                   x=0;
                   y+=2;
                }
                                                
        PC_DispChar(x, y,                //在x,y位置显示s中的字符
                *(char*)pdata,
                DISP_BGND_BLUE+DISP_FGND_WHITE );
                       x += 1;                        

                //如果按下Esc键则退出uCOS_II
                if (PC_GetKey(&key) == TRUE)
                {
            if (key == 0x1B)
            {
                PC_DOSReturn();
            }
        }

        OSTimeDlyHMSM(0, 0, 3, 0);        //等待
    }
}

void  YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
       
    pdata = pdata;
       
   
    for (;;)
        {        
        if (x>10)
                {
                        x=0;
                        y+=2;
                }
               
        PC_DispChar(x, y,                                        //在x,y位置显示s中的字符
                        *(char*)pdata,       
                        DISP_BGND_BLUE+DISP_FGND_WHITE );
                x += 1;                        
               
                //如果按下Esc键则退出uCOS_II
                if (PC_GetKey(&key) == TRUE)
                {
            if (key == 0x1B)
                        {
                PC_DOSReturn();
            }
        }
               
        OSTimeDlyHMSM(0, 0, 1, 0);        //等待
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-6-18 21:01:44 | 显示全部楼层
华兄 发表于 2013-6-18 19:18
1、不执行。在ucos中,调用OSTimeDlyHMSM()会让当前任务阻塞,切换到其它就绪的高优先级任务运行。

2、这 ...

谢谢啦,第二个问题我还有些不太懂                OSTimeDlyHMSM(0, 0, 3, 0);        //等待         这个函数在任务调度器被关闭之后就也不执行了吗

出0入0汤圆

 楼主| 发表于 2013-6-19 14:39:12 | 显示全部楼层
华兄 发表于 2013-6-19 09:36
会执行哦,只不过里面不会作任务切换(调度器关闭的情况下),执行完以后又回到当前任务。 ...


但我实际的情况是就是一大串M是一起出来的,没有了延时的效果,然后就相当于直接到了80的设定,调度器就直接开了

出0入0汤圆

 楼主| 发表于 2013-6-19 17:33:05 | 显示全部楼层
华兄 发表于 2013-6-19 17:28
朋友,你这样调试一下,把void  YouTask(void *pdata)这个任务去掉,再对打印的结果进行分析,注:你要明白 ...

好的,我试一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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