昨天移植RTGUI后,使用按键的方式触发画面切换,发现一次按键会触发两次画面切换,调试发现一次按键会想RTGUI发送两次kbd事件。最后发现是按键处理线程出现了问题,但是实在找不出出现这个问题的原因,这里贴出我调试的过程,恳求坛友帮助。
以下是按键处理线程代码(这是使用RealBoard4088中的按键驱动):
static void key_thread_entry(void *parameter)
{
rt_time_t next_delay;
struct rtgui_event_kbd kbd_event;
key_gpio_config();
/* init keyboard event */
RTGUI_EVENT_KBD_INIT(&kbd_event);
kbd_event.wid = RT_NULL;
kbd_event.mod = RTGUI_KMOD_NONE;
kbd_event.unicode = 0;
while (1)
{
next_delay = 10;
kbd_event.key = RTGUIK_UNKNOWN;
kbd_event.type = RTGUI_KEYDOWN;
if (key_left_GETVALUE() == 0)
{
rt_thread_delay(next_delay*2);
if(key_left_GETVALUE() == 0)
{
rt_kprintf("key_left
");
kbd_event.key = RTGUIK_LEFT;
}
}
if (key_right_GETVALUE() == 0)
{
rt_thread_delay(next_delay*2);
if(key_right_GETVALUE() == 0)
{
rt_kprintf("key_right
");
kbd_event.key = RTGUIK_RIGHT;
}
}
if (kbd_event.key != RTGUIK_UNKNOWN)
{
/* post down event */
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
next_delay = 10;
/* delay to post up event */
rt_thread_delay(next_delay);
/* post up event */
kbd_event.type = RTGUI_KEYUP;
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
}
/* wait next key press */
rt_thread_delay(next_delay);
}
}
这段代码最后几行代码执行很奇怪,当有按键被检测到后,先向RTGUI发送按下事件,延时一段时间后,再发送弹起事件,但是在执行了最后的
rt_thread_delay(next_delay);
后,程序竟然很诡异地跑到
/* post up event */
kbd_event.type = RTGUI_KEYUP;
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
又重新执行了一次,而且程序也并没有执行更前面的代码。
也就是说程序在执行了一段程序后,突然跳转到这段代码的中间位置执行了一次,我想破脑袋也不知道是怎么一回事。
另外,如果是在最后一行代码使用step over进行调试,程序可以顺利跳转到while的起始位置(不过还是触发两次),而使用全速运行的话,就会跳转到中间那个奇怪的位置。
在这里向各各位坛友肯求帮助,谢谢!
rt-thread版本:1.2.3
RTGUI版本:0.8
调试环境:KEIL MDK-ARM 5.0.5
硬件平台:stm32F103VE
查看更多