野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14286|回复: 7

关于修改UCOS II2.86系统按键任务异常的问题

[复制链接]
发表于 2015-11-24 17:38:38 | 显示全部楼层 |阅读模式
实验条件:野火ISO-MINI开发板
实验工程:两个按键控制RGB三色灯
void Task_KEY_1(void *p_arg)
{
    (void)p_arg;   

    while (1)
    {
                        /******************KEY1检测*******************/
                        if((key1_H2L == 0)&&(key1_L2H == 0))//
                        {
                                if(Key1 == Key_High)
                                {
                                        OSTimeDlyHMSM(0, 0,0,100);
                                        if (Key1 == Key_High)
                                        {
                                                key1_H2L = 1;
                                                key1_L2H = 0;
                                                LED1( ON  );
                                                LED2( OFF );
                                                LED3( OFF );
                                                printf("Key1 is Low!\r\n");
                                        }
                                }
                        }
                        if(key1_H2L == 1)//μíμçƽ*¼ì2aμí±ä¸ß
                        {
                                if(Key1 == Key_Low)
                                {
                                        OSTimeDlyHMSM(0, 0,0,100);
                                        if (Key1 == Key_Low)
                                        {
                                                key1_H2L = 0;
                                                key1_L2H = 0;
                                                LED1( OFF );
                                                LED2( OFF );
                                                LED3( OFF );
                                                printf("Key1 is High!\r\n");
                                        }
                                }
                        }
    }
}

void Task_KEY_2(void *p_arg)
{
    (void)p_arg;                                                // 'p_arg' 2¢ûóDóÃμ½£¬·àÖ1±àòëÆ÷ìáê¾¾ˉ¸æ

    while (1)
    {
                        /******************KEY1¼ì2aÄ£¿é*******************/
                        if((key2_H2L == 0)&&(key2_L2H == 0))//Æeê¼×′쬸ßμçƽ*¼ì2a¸ß±äμí
                        {
                                if(Key2 == Key_High)
                                {
                                        OSTimeDlyHMSM(0, 0,0,100);
                                        if (Key2 == Key_High)
                                        {
                                                key2_H2L = 1;
                                                key2_L2H = 0;
                                                LED2( ON  );
                                                LED1( OFF );
                                                LED3( OFF );
                                                printf("Key2 is Low!\r\n");
                                        }
                                }
                        }
                        if(key2_H2L == 1)//μíμçƽ*¼ì2aμí±ä¸ß
                        {
                                if(Key2 == Key_Low)
                                {
                                        OSTimeDlyHMSM(0, 0,0,100);
                                        if (Key2 == Key_Low)
                                        {
                                                key2_H2L = 0;
                                                key2_L2H = 0;
                                                LED1( OFF );
                                                LED2( OFF );
                                                LED3( OFF );
                                                printf("Key2 is High!\r\n");
                                        }
                                }
                        }
    }
}


int main(void)
{
  BSP_Init();
        OSInit();
       
        OSTaskCreate(Task_KEY_1,(void *)0,                          //′′½¨èÎÎñ1
           &task_key1_stk[TASK_KEY1_STK_SIZE-1], TASK_KEY1_PRIO);
       
        OSTaskCreate(Task_KEY_2,(void *)0,                          //′′½¨èÎÎñ2
           &task_key2_stk[TASK_KEY2_STK_SIZE-1], TASK_KEY2_PRIO);
       
        OSStart();
    return 0;
}


任务优先级设置:

#define     TASK_KEY1_PRIO     4          
#define        TASK_KEY2_PRIO         5


理论正常现象:
按下K1,   LED亮,绿色,松开K1,LED灭;
按下K2,   LED亮,蓝色,松开K2,LED灭;
问题:只有任务KEY1可以运行,任务KEY2不运行;
          如果#define     TASK_KEY1_PRIO    5
                  #define        TASK_KEY2_PRIO         4
         则只有任务KEY2可以运行,任务KEY1不运行;
请教大神帮忙看看,谢谢!

主题推荐

回复

使用道具 举报

发表于 2015-11-24 17:49:24 | 显示全部楼层
在任务的while循环里要加延时,不然高优先级的任务不休息,会一直占用CPU,其它低优先级的任务就无法通过调度器获得CPU,所以就根本不会运行了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-24 17:52:14 | 显示全部楼层
在任务的while循环里必须要加延时吗?
回复 支持 反对

使用道具 举报

发表于 2015-11-24 17:54:55 | 显示全部楼层
langwangjc 发表于 2015-11-24 17:52
在任务的while循环里必须要加延时吗?

无论长短,至少要有,它停止运行的时间就是其它低优先级任务的最大运行时间
回复 支持 反对

使用道具 举报

发表于 2015-11-24 17:56:34 | 显示全部楼层
你的按键检测,停止个10-20ms检测一次,完全没有问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-24 18:00:44 | 显示全部楼层
void Task_KEY_1(void *p_arg)
{
    (void)p_arg;                                                // 'p_arg' 2¢ûóDóÃμ½£¬·àÖ1±àòëÆ÷ìáê¾¾ˉ¸æ

    while (1)
    {
                        /******************KEY1¼ì2aÄ£¿é*******************/
                        if((key1_H2L == 0)&&(key1_L2H == 0))//Æeê¼×′쬸ßμçƽ*¼ì2a¸ß±äμí
                        {
                                if(Key1 == Key_Low)
                                {
                                        OSTimeDlyHMSM(0, 0,0,100);
                                        if (Key1 == Key_High)
                                        {
                                                key1_H2L = 1;
                                                key1_L2H = 0;
                                        }
                                }
                        }
                        if(key1_H2L == 1)//μíμçƽ*¼ì2aμí±ä¸ß
                        {
                                if(Key1 == Key_High)
                                {
                                        OSTimeDlyHMSM(0, 0,0,100);
                                        if (Key1 == Key_Low)
                                        {
                                                key1_H2L = 0;
                                                key1_L2H = 0;
                                               
                                                LED1( ON );
                                                OSTimeDlyHMSM(0, 0,0,100);
                                                LED1( OFF );
                                                LED2( OFF );
                                                LED3( OFF );
                                                key1_cnt ++;
                                                printf("Key1 is Active!***%d\r\n",key1_cnt);
                                        }
                                }
                        }
    }
}
改成了这样子也可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-24 18:01:19 | 显示全部楼层
您说的我理解了,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-24 18:09:10 | 显示全部楼层
void Task_KEY_1(void *p_arg)
{
    (void)p_arg;                                                // 'p_arg' 2¢ûóDóÃμ½£¬·àÖ1±àòëÆ÷ìáê¾¾ˉ¸æ

    while (1)
    {
                        /******************KEY1¼ì2aÄ£¿é*******************/
                        if((key1_H2L == 0)&&(key1_L2H == 0))//Æeê¼×′쬸ßμçƽ*¼ì2a¸ß±äμí
                        {
                                if(Key1 == Key_Low)
                                {
                                        OSTimeDlyHMSM(0, 0,0,100);
                                        if (Key1 == Key_High)
                                        {
                                                key1_H2L = 1;
                                                key1_L2H = 0;
                                        }
                                }
                        }
                        if(key1_H2L == 1)//μíμçƽ*¼ì2aμí±ä¸ß
                        {
                                if(Key1 == Key_High)
                                {
                                        OSTimeDlyHMSM(0, 0,0,100);
                                        if (Key1 == Key_Low)
                                        {
                                                key1_H2L = 0;
                                                key1_L2H = 0;
                                               
                                                LED1( ON );
                                                OSTimeDlyHMSM(0, 0,0,100);
                                                LED1( OFF );
                                                LED2( OFF );
                                                LED3( OFF );
                                                key1_cnt ++;
                                                printf("Key1 is Active!***%d\r\n",key1_cnt);
                                        }
                                }
                        }
                        //delay200ms,give other task延时是加在这里吗?
                        OSTimeDlyHMSM(0, 0,0,20);
                       
    }
}
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-28 23:24 , Processed in 0.037934 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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