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的时候写指令流水线还没有完成。
调试单步执行正常是因为单步执行的时候指令之间会有空隙,这空隙足够长,写指令早完成了。