罗辉
unread,Sep 12, 2012, 4:52:00 AM9/12/12Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to rt-threa...@googlegroups.com
rtthread版本:svn-r2255
硬件平台:tms320dm365
运行libc测试程序时会出现data about异常,经过排查,发现是内存访问对齐问题,异常现象打印信息如下:
finsh />libc_ex1()
create a succeeded 0
create b succeeded 0
Starting process a
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaStarting
process b
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
。。。。。。。。。。。略去若干行。。。。。。。。。。。。。。。。。
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbExecption:
r00:0x00000000 r01:0x600000d3 r02:0x800a41d8 r03:0xb5f3f5db
r04:0x00000000 r05:0x00000000 r06:0x00000000 r07:0x00000000
r08:0x00000000 r09:0x00000000 r10:0x00000000
fp :0x800781ac ip :0x00000000
sp :0x89f48104 lr :0x20401819 pc :0x8000170c
cpsr:0xa00000d3
data abort
thread - tidle stack:
thread pri status sp stack size max used left tick error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
pth01 0xc0 close 0x0000007c 0x00000800 0x0000077c 0x00000002 000
pth00 0xc0 close 0x0000007c 0x00000800 0x0000077c 0x00000004 000
tidle 0xff ready 0x00000054 0x00000100 0x000000a8 0x0000000b 000
timer 0x08 suspend 0x0000007c 0x00000200 0x0000007c 0x00000009 000
tshell 0x14 suspend 0x000001dc 0x00001000 0x00000884 0x00000007 000
shutdown...
(0) assert failed at rt_hw_cpu_shutdown:189
对比反汇编代码后
800016b8: eb003e9b bl 8001112c <rt_hw_interrupt_disable>
800016bc: e1a03000 mov r3, r0
800016c0: e50b3014 str r3, [fp, #-20]
800016c4: e59f0184 ldr r0, [pc, #388] ; 80001850 <rt_thread_idle_excute+0x21c>
800016c8: ebffffc0 bl 800015d0 <rt_list_isempty>
800016cc: e1a03000 mov r3, r0
800016d0: e3530000 cmp r3, #0
800016d4: 1a00002f bne 80001798 <rt_thread_idle_excute+0x164>
800016d8: e59f3170 ldr r3, [pc, #368] ; 80001850 <rt_thread_idle_excute+0x21c>
800016dc: e5933000 ldr r3, [r3]
800016e0: e2433030 sub r3, r3, #48 ; 0x30
800016e4: e50b3010 str r3, [fp, #-16]
800016e8: e51b3010 ldr r3, [fp, #-16]
800016ec: e5933024 ldr r3, [r3, #36] ; 0x24
800016f0: e50b300c str r3, [fp, #-12]
800016f4: e51b300c ldr r3, [fp, #-12]
800016f8: e3530000 cmp r3, #0
800016fc: 0a000007 beq 80001720 <rt_thread_idle_excute+0xec>
80001700: e51b300c ldr r3, [fp, #-12]
80001704: e5932038 ldr r2, [r3, #56] ; 0x38
80001708: e51b3010 ldr r3, [fp, #-16]
8000170c: e1520003 cmp r2, r3 --------------------------》产生异常点
80001710: 1a000002 bne 80001720 <rt_thread_idle_excute+0xec>
80001714: e51b300c ldr r3, [fp, #-12]
80001718: e3a02000 mov r2, #0
8000171c: e5832038 str r2, [r3, #56] ; 0x38
80001720: e51b3010 ldr r3, [fp, #-16]
80001724: e2833030 add r3, r3, #48 ; 0x30
80001728: e1a00003 mov r0, r3
8000172c: ebffff8f bl 80001570 <rt_list_remove>
对应c程序如下:
void rt_thread_idle_excute(void)
{
/* check the defunct thread list */
if (!rt_list_isempty(&rt_thread_defunct))
{
rt_base_t lock;
rt_thread_t thread;
#ifdef RT_USING_MODULE
rt_module_t module = RT_NULL;
#endif
RT_DEBUG_NOT_IN_INTERRUPT;
/* disable interrupt */
lock = rt_hw_interrupt_disable();
/* re-check whether list is empty */
if (!rt_list_isempty(&rt_thread_defunct))
{
/* get defunct thread */
thread = rt_list_entry(rt_thread_defunct.next, struct rt_thread, tlist);
#ifdef RT_USING_MODULE
/* get thread's parent module */
module = (rt_module_t)thread->module_id;
/* if the thread is module's main thread */
if (module != RT_NULL && module->module_thread == thread)
{
/* detach module's main thread */
module->module_thread = RT_NULL;
}
#endif
/* remove defunct thread */
rt_list_remove(&(thread->tlist));
/* invoke thread cleanup */
if (thread->cleanup != RT_NULL)
thread->cleanup(thread);
/* if it's a system object, not delete it */
if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE)
{
/* enable interrupt */
rt_hw_interrupt_enable(lock);
return;
}
}
else
{
/* enable interrupt */
rt_hw_interrupt_enable(lock);
/* may the defunct thread list is removed by others, just return */
return;
}
/* enable interrupt */
rt_hw_interrupt_enable(lock);
#ifdef RT_USING_HEAP
#if defined(RT_USING_MODULE) && defined(RT_USING_SLAB)
/* the thread belongs to an application module */
if (thread->flags & RT_OBJECT_FLAG_MODULE)
rt_module_free((rt_module_t)thread->module_id, thread->stack_addr);
else
#endif
/* release thread's stack */
rt_free(thread->stack_addr);
/* delete thread object */
rt_object_delete((rt_object_t)thread);
#endif
#ifdef RT_USING_MODULE
if (module != RT_NULL)
{
/* if sub thread list and main thread are all empty */
if ((module->module_thread == RT_NULL) &&
rt_list_isempty(&module->module_object[RT_Object_Class_Thread].object_list) )
{
module->nref --;
}
/* unload module */
if (module->nref == 0)
rt_module_unload(module);
}
#endif
}
}
上面蓝色的部分是出现问题的地方,对比汇编和c代码即可得到如下结果
r2=module->module_thread
r3=thread
根据异常信息
r02:0x800a41d8 r03:0xb5f3f5db
可知thread指针异常,0xb5f3f5db地址并不在内存中,不过又没有发现栈溢出,比较奇怪。
另外测试libc_ex2也是data about异常
finsh />libc_ex2()
mutex init:pmtx00
Execption:
r00:0x00000000 r01:0x600000d3 r02:0x00000000 r03:0xe75bd033
r04:0x8007713c r05:0x80076de8 r06:0x00000400 r07:0x00000000
r08:0x00000000 r09:0x80076de8 r10:0x800b57c4
fp :0x800b516c ip :0x00002009
sp :0x89f48104 lr :0x00401819 pc :0x8000a910
cpsr:0x60000013
data abort
thread - pth00 stack:
thread pri status sp stack size max used left tick error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
pth01 0xc0 ready 0x00000044 0x00000800 0x00000044 0x00000005 000
pth00 0xc0 ready 0x00000044 0x00000800 0x000006e8 0x00000005 000
tidle 0xff ready 0x00000084 0x00000100 0x000000a8 0x00000004 000
timer 0x08 suspend 0x0000007c 0x00000200 0x0000007c 0x00000009 000
tshell 0x14 suspend 0x000001d4 0x00001000 0x00000250 0x00000009 000
shutdown...
(0) assert failed at rt_hw_cpu_shutdown:189
通过上面的情况来看这个问题与pthread有关系,现在这个问题该如何继续查下去?