; PendSV_Handler
PendSV_Handler
LDR R2, =OSTcbCurr ; 不必关中断。嵌套中断发生时会自动保存 R0~R3 到 MSP 并恢复
LDR R0, [R2] ; 如果发生咬尾的多个 PendSV,上半段相当于把已弹出的 {R4-R11} 再次压栈
; CBZ R0, PendSV_Handler_1 ; if(OSTcbCurr == NULL) 跳转至 PendSV_Handler_1
CMP R0, #0
BEQ PendSV_Handler_1
MRS R3, PSP ; PSP 位置存储了自动压栈内容。
SUBS R3, R3, #32 ; PSP -= 8。新位置存储 R4-R11。向高地址增长时才可借用 ! 更新 R3
STR R3, [R0] ; OSTcbCurr->StkPtr = PSP
; STM R3, {R4-R11} ; 此时 PUSH 使用的是 MSP,要修改 PSP 指向的内容,要用 STM
STM R3!, {R4-R7}
MOV R4, R8
MOV R5, R9
MOV R6, R10
MOV R7, R11
STM R3!, {R4-R7}
SUBS R3, R3, #32
1、tst:逻辑处理指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。当前运算结果为1,则Z=0;当前运算结果为0,则Z=1
cmp:算数处理指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行减法比较,不存储结果,都会更改标志位
bne: 数据跳转指令,标志寄存器中Z标志位不等于零时, 跳转到BNE后标签处
beq: 数据跳转指令,标志寄存器中Z标志位等于零时, 跳转到BEQ后标签处
2、实例
tst r0 , #0x2 //进行and运算,如果bit_2为1,zero==0,如果bit_2为0,则zero==1,即该指令测试bit_2是否为0
bne led_blink //非零则跳转,若zero==1,跳转到led_blink处执行;若zero==0,则继续执行下一步指令
3、实例
sub r1 , r1 , #1 //r1=r1-1
cmp r1 , #0 //r1是否等于0,并更改标志位
bne led_blink //zero==1时跳转至led_blink处,zero==0时则继续执行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)