void usrTestCallPcInst()
{
unsigned long VOS_vxR1Get[] =
{
0x38610000, /* addi r3,r1,0 */
0x4e800020 /* blr */
};
USRFUNCPTR pVxR1Get = ((USRFUNCPTR)&VOS_vxR1Get);
((USRFUNCPTR)(&VOS_vxR1Get))();
}
上面这段函数的目的是获取调用者的地址,在获取函数调用栈的时候会用到。但直接执行会抛出异常,然后任务被挂起。需要改成下面的样子:
void usrTestCallPcInst()
{
unsigned long VOS_vxR1Get[] =
{
0x38610000, /* addi r3,r1,0 */
0x4e800020 /* blr */
};
USRFUNCPTR pVxR1Get = ((USRFUNCPTR)&VOS_vxR1Get);
cacheTextUpdate((unsigned long)VOS_vxR1Get, 0x100);
((USRFUNCPTR)(&VOS_vxR1Get))();
}
抛出异常的原因在于数据cache与指令cache失步,需要在执行之前手工调用一下cacheTextUpdate将代码同步起来。
阅读(528) | 评论(0) | 转发(0) |