定义RTGUI_USING_MOUSE_CURSOR引起死机的问题及排查过程
本帖最后由 amwox 于 2012-6-29 20:45 编辑在RADIO板上新建了一个RTGUI(1.01)的空工程,创建三个面板,RTGUI的相关定义如下:
/* SECTION: RT-Thread/GUI */
#define RT_USING_RTGUI
/* name length of RTGUI object */
#define RTGUI_NAME_MAX 12
/* support 16 weight font */
#define RTGUI_USING_FONT16
/* support Chinese font */
#define RTGUI_USING_FONTHZ
/* use DFS as file interface */
#define RTGUI_USING_DFS_FILERW
/* use font file as Chinese font */
//#define RTGUI_USING_HZ_FILE
/* use Chinese bitmap font */
#define RTGUI_USING_HZ_BMP
/* use small size in RTGUI */
#define RTGUI_USING_SMALL_SIZE
/* use mouse cursor */
/* #define RTGUI_USING_MOUSE_CURSOR */
/* default font size in RTGUI */
#define RTGUI_DEFAULT_FONT_SIZE 16
/* image support */
/* #define RTGUI_IMAGE_XPM */
/* #define RTGUI_IMAGE_BMP */
#define RTGUI_USING_WINMOVE //新加的
/* use mouse cursor */
#define RTGUI_USING_MOUSE_CURSOR//新加的
RADIO板的驱动全是验证过的.编译下载到RADIO板.输出下列信息
\ | /
- RT - Thread Operating System
/ | \ 1.0.1 build Jun 29 2012
2006 - 2011 Copyright by rt-thread team
found part, begin: 32256, size: 974.224MB
rtc is not configured
please configure with set_date and set_time
File System initialized!
finsh>>psr: 0x01000000
pc: 0x0800da8c
lr: 0x0800e99d
r12: 0x00000000
r03: 0xffffffff
r02: 0x20002340
r01: 0x00000000
r00: 0x200001e0
hard fault on thread: rtgui
threadpristatus sp stack size max used left tickerror
-------- ---- ------- ---------- ---------- ---------- ---------- ---
wb 0x19 ready 0x00000040 0x00001000 0x00000040 0x0000000a 000
tvkey 0x11 ready 0x00000040 0x00000400 0x00000040 0x0000000a 000
tinfo 0x10 ready 0x00000040 0x00000400 0x00000040 0x0000000a 000
rtgui 0x0f ready 0x00000040 0x00000400 0x000000d0 0x00000005 000
key 0x1e ready 0x00000040 0x00000180 0x00000040 0x00000005 000
tidle 0x1f ready 0x00000040 0x00000100 0x00000040 0x0000001f 000
tshell 0x14 suspend 0x00000088 0x00000800 0x00000088 0x0000000a 000
init 0x08 0x00000068 0x00000800 0x0000015c 0x00000012 000
led 0x14 suspend 0x00000078 0x00000200 0x00000078 0x00000005 000
一个新建的空程 居然出现异常?!
从输出信息中判断引起异常的现象来自出rtgui线程.有点怀疑结果的正确性,毕竟我不是第一个使用的啊.
注释掉rtgui_startup(),现象消失,证明了输出结果完全正确.
恢复现场,进入调试模式,根据异常的pc值查反汇编代码,结果如下:
268: _rtgui_cursor->show_cursor_count ++;
0x0800DA7C 0000 MOVS r0,r0
0x0800DA7E 0000 MOVS r0,r0
0x0800DA80 0000 MOVS r0,r0
0x0800DA82 0000 MOVS r0,r0
0x0800DA84 0000 MOVS r0,r0
0x0800DA86 0000 MOVS r0,r0
0x0800DA88 0000 MOVS r0,r0
269: if (_rtgui_cursor->show_cursor_count == 1)
270: {
271: /* save show mouse area */
0x0800DA8A 0000 MOVS r0,r0
0x0800DA8C 0000 MOVS r0,r0
0x0800DA8E 0000 MOVS r0,r0
0x0800DA90 0000 MOVS r0,r0
0x0800DA92 0000 MOVS r0,r0
272: rtgui_cursor_save();
273:
274: /* show mouse cursor */
0x0800DA94 0000 MOVS r0,r0
0x0800DA96 0000 MOVS r0,r0
275: rtgui_cursor_show();
276: }
0x0800DA98 0000 MOVS r0,r0
0x0800DA9A 0000 MOVS r0,r0
设好断点,再试原来是_rtgui_cursor为空
问题出在这里 RTGUI_IMAGE_XPM被我注释掉了!创建光标失败!
建议:
1. 在使用的文件中对宏定义作关联性的检查,如果是存在依赖关系的定义.
2. 以_rtgui_cursor为一个对象来看,只要有创建失败的可能,就应该进行必要的检查,进一步健全代码
楼主排查的方法值得学习。
下班了,昨天的事件还没结束.
在rtconfig.h中启用
#define RTGUI_IMAGE_XPM
#define RTGUI_USING_MOUSE_CURSOR
编译下载后,结果如下:
finsh>>psr: 0x21000000
pc: 0x08014d8a
lr: 0x0800e061
r12: 0x08011421
r03: 0x00000020
r02: 0x20005674
r01: 0x00000004
r00: 0x00000000
hard fault on thread: rtgui
还是异常了!!还是来自于rtgui!!!
按昨天的方法查到异常点在rt_memcpy中
如果在异常出现之前多个地方调用了rt_memcpy,那么按昨天的方法直接在rt_memcpy中设置断点,并不一定合适.
根据lr的值找到rt_memcpy的调用点--rtgui_cursor_restore.
rt_memcpy(fb_ptr, cursor_ptr, cursor_pitch)中的fb_ptr为0引起了异常.来自于RADIO板的LCD驱动返回的framebuffer为0.
这说明目前RADIO板上的LCD驱动不能直接使用MOUSE_CURSOR,
如果要用必须使用其它的方法实现.
这个偶然碰到的问题就到这里了.
楼主的建议很好总要,目前RTT的宏确实非常多,而且相互之间是有联系的。如果屏蔽掉一个宏之后,其他与之相关的宏的功能可能也会受到影响,导致出现很多平时不会出现的异常情况,这个目前确实是一个大问题,尤其是在进行系统的剪裁的时候。因此建议开发组可以提供一个相关性检查,或者出一个专门的相关性的文档,提示用户,当你屏蔽掉那个宏之后,哪些功能会受到影响,以及与之相关的宏是那些,应该如何修改等等。
页:
[1]