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