打印
[uCOS/RTOS]

请教:新手请教ucos ii按键任务的疑问

[复制链接]
3706|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sea1105|  楼主 | 2014-3-19 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ucos, LED, ST, IO, pi
刚学ucos ii,拿着野火的M3开发板写了一个简单的程序,通过按键控制LED灯的亮灭。但是试验的时候发现按键控制LED灯有问题:按键按下LED灯有时候会出现闪烁现象,LED闪烁后分2种情况,一种是在闪烁后切换状态,一种是在闪烁后状态不变。一直百思不得其解,不知道是不是对ucos ii理解有误。下面是部分代码,请大家帮忙看看是哪里有问题。
#include "includes.h"

OS_STK task_led2_stk[TASK_LED2_STK_SIZE];                  //定义栈
OS_STK task_led3_stk[TASK_LED3_STK_SIZE];                  //定义栈
OS_STK task_key1_stk[TASK_KEY1_STK_SIZE];                  //定义栈

enum LED_STATUS{LED_SWITCH,LED_ON,LED_OFF};
enum LED_STATUS led1_status = LED_ON;

void Task_Start(void *p_arg)
{
    (void)p_arg;                                                // 'p_arg' 并没有用到,防止编译器提示警告

        OSTaskCreate(Task_LED2,(void *)0,                          //创建任务2
           &task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO);

        OSTaskCreate(Task_LED3,(void *)0,                           //创建任务3
           &task_led3_stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO);

        OSTaskCreate(Task_KEY1,(void *)0,                           //创建任务3
           &task_key1_stk[TASK_KEY1_STK_SIZE-1], TASK_KEY1_PRIO);

    while (1)
    {
                switch(led1_status)
                {
                        case LED_ON:
                                LED1( ON );
                        break;
                       
                        case LED_OFF:  
                        LED1( OFF);   
                        break;
                       
                        default:
                        break;
                }
               
                OSTimeDlyHMSM(0, 0,0,1);   
    }
}

//任务2
void Task_LED2(void *p_arg)
{
    (void)p_arg;                       
       
    while (1)
    {
        LED2( ON );
        OSTimeDlyHMSM(0, 0,1,0);
        LED2( OFF);
                OSTimeDlyHMSM(0, 0,0,500);       
    }
}

//任务3
void Task_LED3(void *p_arg)
{
    (void)p_arg;      
       
    while (1)
    {
        LED3( ON );
        OSTimeDlyHMSM(0, 0,0,500);
        LED3( OFF);
                OSTimeDlyHMSM(0, 0,0,500);        
    }
}

//任务4
//?????按键控制LED灯有时候闪烁:有的闪烁后切换状态,有的闪烁后状态不变
void Task_KEY1(void *p_arg)
{
    INT8U flag_key1 = 0;
        (void)p_arg;      
       
    while (1)
    {
        if(KEY_ON == GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_5))
                {
                        OSTimeDlyHMSM(0, 0,0,10);
                        if(KEY_ON == GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_5))
                                flag_key1 = 1;
                        else
                                flag_key1 = 0;
                }
                else flag_key1 = 0;

        if(1 == flag_key1)
                {
                        if(led1_status == LED_ON)
                                led1_status = LED_OFF;
                        else
                                led1_status = LED_ON;

                        flag_key1 = 0;
                }
        OSTimeDlyHMSM(0, 0,0,1);     
    }
}

相关帖子

沙发
craaazyfor| | 2014-3-20 08:11 | 只看该作者
1.OSStart呢?
2.你的按键扫描到以后有控制led吗?

使用特权

评论回复
板凳
sea1105|  楼主 | 2014-3-20 09:19 | 只看该作者
craaazyfor 发表于 2014-3-20 08:11
1.OSStart呢?
2.你的按键扫描到以后有控制led吗?

OSStart在主程序里,按键能控制led1的亮灭,只是有时候会出现闪烁情况,感觉就好像按键的防抖动没处理好一样,不知道是不是Task_KEY1任务里按键的程序有什么问题。

使用特权

评论回复
地板
sea1105|  楼主 | 2014-3-20 11:16 | 只看该作者
dwh000 发表于 2014-3-20 11:12
芯片是什么型号,主频多高,
os设置的tick设置的多长时间?

STM32F103 主频72MHz
tick设置的1ms

使用特权

评论回复
5
SevenWans| | 2014-3-20 18:47 | 只看该作者
不知道任务调度有问题没有,tick时间确定对不对啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:25岁的我——年轻无极限! 30岁之前——实现梦想!

6

主题

54

帖子

0

粉丝