2.3 SVC中断

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值