1.5.4_swi异常模式程序示例

时间:2024-05-18 17:43:55

上电之后,程序会进行reset,这时会进入svc模式,这是一种特权模式。
1.5.4_swi异常模式程序示例
APP运行于usr mode,在该模式下APP访问硬件时,必须切换mode为svc mode,否则会受限。

那么,怎么切换mode呢?我们知道,当发生异常时,比如中断和未定义指令异常,CPU会进入对应的特权模式,在这些模式下可以进入svc mode,但是这些异常都不稳定。所以,我们使用的是swi(software interrupt)异常,通过指令swi #val(使用软中断)来进入svc模式,同时还可以根据#val来判断需要进行什么样的处理。

先从svc模式切换到usr模式:
1.5.4_swi异常模式程序示例
然后再通过一条swi指令进入svc模式:
1.5.4_swi异常模式程序示例
退出异常时,将lr_svc直接赋给PC即可,所以存lr_svc时直接存就行。
1.5.4_swi异常模式程序示例
然后,在svc异常的处理程序中,输出cpsr的值和表示进入swi异常的字符串。这些部分与未定义指令异常的处理没有什么不同。

除了上述这些,还要找到swi指令的val值。我们知道进入svc异常时,lr_svc保存的是cpu下一条要处理的指令的地址,也就是ldr pc, =main的地址。该地址减去4,就是swi 0x123的地址。
1.5.4_swi异常模式程序示例
所以我们先将lr的值保存到r4,这是由于中间的printException会进行子程序调用,保存到r4可以保证不会被破坏。然后把r4 - 4得到swi 0x123的地址,赋给r0,然后跳到printSWIVal子程序中去,在这个子程序中再取出#val并输出。
1.5.4_swi异常模式程序示例
1.5.4_swi异常模式程序示例
根据下图,我们知道swi的后24位被处理器忽略,这应该就是#val
1.5.4_swi异常模式程序示例
最终的结果如下图:cpsr的[M4:M0]为0b10011,进入了svc模式,输入的#val也正确。
1.5.4_swi异常模式程序示例

1.5.4_swi异常模式程序示例

1.5.4_swi异常模式程序示例
当运行与Thumb指令集时,swi指令为16位,这时他的#val只有八位,也就是最后八位。
1.5.4_swi异常模式程序示例