刚学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);
}
}
|