赞
踩
笔者来介绍arc的编程模型的中断流程和异常流程
主要介绍一下中断进入的流程,包括需要配置的寄存器等信息。
主要介绍一些arc-v2版本的异常向量以及异常的处理流程。也分为同步异常和异步的异常:
异常向量共有16个,向量号0x-0x15,占用64字节,每个异常向量就是一个异常处理函数地址,异常发生后,会从该处取地址,然后跳到对应的处理函数。
每个异常可能都有多种原因,为了区分多种异常原因,arc这边提供了辅助寄存器来指示异常的原因,有点类似于ARM架构下面的fsr ,详情看ARM学习(3) 异常模式学习(CortexR5),寄存器为ESR,上文中已经介绍过,ARC学习(2)基本编程模型认识(二)。
再来看一下异常向量具体会有哪些原因触发:
内存类型有如下几种:
10. 软件中断:SWI 或者SWI_S指令会触发该向量处理函数,
异常的优先级和处理顺序:处理器每次都只能处理一个异常,所以当多个异常发生时,要排队处理,涉及到优先处理的异常。
注意:异常的优先级不按异常向量来决定,而是根据异常的原因来进行排序。
异常进入:exception entry
流程图绘制:
异常退出:exception exit:
主要是影响:ERET、ESTATUS和ERBTA,恢复到原来的状态,PC,STATUS32和BTA,以及恢复寄存器等等,相对比较简单。
下面例子代码会造成异常,0x3FFFFFFF是memory总线不存在的例子,
ls_u32_t *ptr=0x3FFFFFFF;
printf("0x%x 0x%x\r\n", ptr, *ptr);
实际异常后,打印出如下寄存器信息:
[18999]reg0=0x0001 [18999]reg1=0x0003 [18999]reg2=0x1fd30 [18999]reg3=0x30000000 [18999]reg4=0x0000 [18999]reg5=0x3fffffff [18999]reg6=0x0000 [18999]reg7=0x0000 [18999]reg8=0x10004f68 [18999]reg9=0x0001 [18999]reg10=0x1a17a [18999]reg11=0x0000 [18999]reg12=0x10004ef7 [18999]reg13=0x0000 [18999]reg14=0x0000 [18999]reg15=0x100006a0 [18999]
[18999]reg16=0x103f4 [18999]reg17=0x0000 [18999]reg18=0x0000 [18999]reg19=0x0020 [18999]reg20=0x0001 [18999]reg21=0x0080 [18999]reg22=0x0000 [18999]reg23=0x0000 [18999]reg24=0x0000 [18999]reg25=0x0000 [18999]reg26=0x0000 [18999]reg27=0x10005000 [18999]reg28=0x10004f8c [18999]reg29=0x172ee [18999]reg30=0x10004f68 [18999]pc=0x4000959c lr=0x1fd2c sp=0x10004f8c status32=0x80081624
[18999]ECR=0x11000 ERET=0x4000ca54 EFA=0x3fffffff ERSTATUS=0x84004
提取出如下异常寄存器如下:
ECR=0x11000
ERET=0x4000ca54
EFA=0x3fffffff
ERSTATUS=0x84004
如ECR寄存器的值,我们可以找到如下说明,看到是访问data memory异常,符合预期异常。
然后EFA=0x3FFFFFFF,就是异常访问的地址信息,确实是异常的地址,
最后ERET,就是异常的返回地址,可以通过addr2line 然后定位源代码位置。
再看一一个异常例子。
ECR=0x1000
ERET=0x3f8eec48
EFA=0x3f8eec48
ERSTATUS=0x80084804
如ECR寄存器的值,我们可以找到如下说明,看到是访问指令 memory异常
看到ERET和EFA,均是0x3f8eec48,怀疑是CPU跑飞到一块异常地址,该地址的值均是0x3f8eec48,所以ERET和EFA相等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。