GUI

移植RTGUI后,使用RealBoard4088的按键驱动切换画面,出现一次按键,触发两次事件的异常

发布于 2014-12-12 12:23:33
昨天移植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

查看更多

关注者
0
被浏览
2.5k
9 个回答
sun723
sun723 2014-12-12
之前都怀疑keil有BUG了,但是刚刚使用IAR工程,问题一样。

发现另外一个现象,如果将调试断点设定在

/* post up event */
kbd_event.type = RTGUI_KEYUP;
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));


前一行代码
rt_thread_delay(next_delay);


处,代码调试正常。不知道这又是什么原因。
sun723
sun723 2014-12-12
将RTGUI替换为github上master分支上最新版本后,问题依旧。
sun723
sun723 2014-12-13
打印了1000多页的stemwin资料,准备转战场了,RTGUI带着慢慢研究吧
bernard
bernard 2014-12-14
这个估计是一些细节性的问题,因为你用的是STM32,所以两次刷新后会出现屏幕闪烁,而LPC4088采用的双缓冲方式,所以两次刷新的问题被掩盖掉了,后续仔细查查,也是时候考虑发布1.0版本了
sun723
sun723 2014-12-15
这个估计是一些细节性的问题,因为你用的是STM32,所以两次刷新后会出现屏幕闪烁,而LPC4088采用的双缓冲方式,所以两次刷新的问题被掩盖掉了,后续仔细查查,也是时候考虑发布1.0版本了


感谢,非常期待。
grissiom
grissiom 2014-12-15
代码乱跳的问题,跟 RTGUI 没什么关系~ 没准是栈写穿了之类的……
bernard
bernard 2014-12-15
乱跳,也可能是开了代码优化,然后用优化的代码来调试
sun723
sun723 2014-12-16
代码优化倒是没有开启,一直都是最低级的状态在调试。栈的问题就不是很清楚了,有时间好好研究研究。谢谢两位的回答。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友