实战_SVC异常
1.1 什么是SVC指令?
在ARM指令中,有一条指令:
SVC #VAL
它会触发一个异常。
在操作系统中,比如各类RTOS或者Linux,都会使用SVC
指令故意触发异常,从而导致内核的异常处理函数被调用,进而去使用内核的服务。
比如Linux中,各类文件操作的函数open
、read
、write
,它的实质都是SVC
指令。
我们此次不讲解SVC
在内核中的使用,我们只是看看如何处理SVC
触发的异常。
1.2 在汇编代码里插入SVC指令
在代码中插入:
SVC #1
看看会发生什么事情。
1.2.1 提供SVC异常处理函数
我们只简单的打印一些信息即可
void SVC_Handler(void)
{
puts("SVC_Handler\n\r");
1.2.2 查看保存的现场
通过在Keil中调试,查看sp的值如下:
打开反汇编文件,0x0800006e
对应的是SVC指令的下一条指令
由此可见,SVC指令异常并不像未定义指令异常一样,在恢复现场时,返回地址指向的是SVC的下一条指令,所以不会出现程序跑飞情况