eCos移植到Cortex-M7执行swi 0导致异常

mingdu.zheng at gmail dot com
http://blog.csdn.net/zoomdy/article/details/78623283

问题描述

eCos移植到Cortex-M7后,每次运行到hal_reset_vsr函数的swi指令就会产生异常(IACCVIOL),连接仿真器进行单步调试则没有问题。

解决办法

在hal_reset_vsr函数的swi指令之前加入dsb和isb指令。

    // Use SVC to switch our state to thread mode running on the PSP.
    // We don't need to do this for RAM startup since the ROM code
    // will have already done it.

    hal_vsr_table[CYGNUM_HAL_VECTOR_SERVICE] = (CYG_ADDRESS)hal_switch_state_vsr;

    __asm__ volatile( "dsb" );
    __asm__ volatile( "isb" );
    __asm__ volatile( "swi 0" );

    hal_vsr_table[CYGNUM_HAL_VECTOR_SERVICE] = (CYG_ADDRESS)hal_default_svc_vsr;

原因分析

从代码中可以看出,swi指令是在紧接着向量表修改之后的,如果向量表写入尚未完成,那么执行swi就会产生异常了。M3/M4正常而M7异常的可能原因是:M3/M4是3级流水线,而M7是6级流水线。M3/M4执行swi的时候写指令流水线已经完成,M7执行swi的时候写指令流水线还没有完成。

调试单步执行正常是因为单步执行的时候指令之间会有空隙,这空隙足够长,写指令早完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值