Cortex M4 SVC 中断

Cortex SVC 中断


SVC(系统管理调用) 异常优先级为1,SVC异常是由SVC指令触发
也可以直接设置NVIC寄存器触发异常
应用程序工作在非特权访问模式,当需要特权模式访问系统资源时,可以使用SVC实现

参考例程:

  1. main
#include <stdio.h>

int __svc(0x00) svc_service_add(int x,int y);
int __svc(0x01) svc_service_sub(int x,int y);
int __svc(0x02) svc_service_inc(int x);

void SVC_Handler_main(unsigned int * svc_args);
使用 __svc 关键字,在调用svc_service_add时,编译器将会调用SVC指令
    13:         x=3;y=5; 
0x08000F28 2403      MOVS     r4,#0x03
0x08000F2A 2505      MOVS     r5,#0x05
    14:         z=svc_service_add(x,y); 
0x08000F2C 4629      MOV      r1,r5
0x08000F2E 4620      MOV      r0,r4
0x08000F30 DF00      SVC      0x00
0x08000F32 4606      MOV      r6,r0
在调用SVC 指令后,如果没有更高优先级存在,那么就会根据异常向量表,跳转到SVC_Handler函数
int main(void)
{
	
	int x,y,z;
	x=3;y=5;
	z=svc_service_add(x,y);
	//printf("3+5=%d\n",z);
	
	x=9;y=2;
	z=svc_service_sub(x,y);
	//printf("9-2=%d\n",z);
	
	x=3;
	z=svc_service_inc(x);
	//printf("3++=%d\n",z);
	while(1);
}
__asm void SVC_Handler(void)
{
	TST LR,#4 ;测试EXC_RETURN的第2位
	ITE EQ
	MRSEQ R0,MSP ;主栈地址
	MRSNE R0,PSP ;进程栈地址
	B __cpp(SVC_Handler_main) ;
	ALIGN 4
}
SVC 异常的处理函数,选择堆栈地址后,跳转到SVC_Handler_main中进行资源访问
void SVC_Handler_main(unsigned int* svc_args)
{
	unsigned int svc_number;
	svc_number=((char*)svc_args[6])[-2];
	switch(svc_number)
	{
		case 0:
			svc_args[0]=svc_args[0]+svc_args[1];
			break;
		case 1:
			svc_args[0]=svc_args[0]-svc_args[1];
			break;
		case 2:
			svc_args[0]=svc_args[0]+1;
			break;
		default:
			break;
	}
	return;
}

参数svc_args中,svc_args[0]-svc_args[3],为参数或者返回值。
svc_args[4]为服务号,就是在调用SVC 指令时传入的立即数
svc_args[5]为EXC_RETURN的地址
svc_args[6]为pc寄存器的值,svc_args[7]为状态寄存器xPSR的值
  1. startup.s
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                ;IMPORT  SystemInit
                ;LDR     R0, =SystemInit
                ;BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

使用keil 软件调试 所以注释 SystemInit 函数

ARM Cortex-M3 Cortex-M4 权威指南(第3版)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值