Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588868
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2010-05-20 23:23:01

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) |
给主人留下些什么吧!~~