2.3 SVC中断

2023-05-16

SVC中断

SVC中断服务函数

通过SVC指令触发SVC中断

 #define   vPortSVCHandler SVC_Handler
__asm void vPortSVCHandler( void )
{
	PRESERVE8

	ldr	r3, =pxCurrentTCB		; 读取 pxCurrentTCB 变量值,R3 =  pxCurrentTCB
	ldr r1, [r3]				; 读取 pxCurrentTCB 栈顶指针,R1 = *( pxCurrentTCB)
	ldr r0, [r1]				; 读取 pxCurrentTCB.pxTopOfStack 也就是读取栈顶指针

	ldmia r0!, {r4-r11,r14}		; 相关数据出栈,剩余寄存器在退出中断后自动出栈
	msr psp, r0					; 更新当前PSP寄存器
	isb
	mov r0, #0					; 清零R0寄存器
	msr	basepri, r0				; 通过basepri寄存器开启中断
	bx r14						; 跳转继续执行之前位置
}

下图为创建后未运行的任务栈分布

某些数据已经压栈,已完成栈初始化操作,所以需要出栈操作

栈顶指针在高地址,随着压栈操作,指针地址逐渐减小(向下生长)在这里插入图片描述
图片出自–[野火®]《FreeRTOS+内核实现与应用开发实战—基于STM32》.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.3 SVC中断 的相关文章

随机推荐