- AREA CODE1, CODE, READONLY
- SysTick_Handler PROC
- EXPORT SysTick_Handler
- IMPORT RTTaskSchedule
- POP {R0-R7}
- PUSH {R0-R7} ;这次压栈后,堆栈和刚进中断时一致,但是栈的内容已经被读到寄存器中
- LDR R6,=RTTaskSchedule ;伪造栈的内容,让异常返回到想要执行的函数
- PUSH {R0-R7}
- LDR R0,=0xFFFFFFF9
- BX R0
- ENDP
- AREA CODE2, CODE, READONLY
- IrqReturn PROC
- EXPORT IrqReturn
- POP {R0,R1} ;进入IrqReturn产生的压栈数据,直接丢弃
- POP {R0-R7} ;下面恢复进入systick中断前的8个寄存器
- MOV R12,R4
- ; MOV LR,R5 ;LR的值保持当前
- MSR XPSR,R7
- MOV PC, R6
- ; BX LR
- ENDP
- END
复制代码
我想通过SysTick的嵌套自身,实现任务的抢占式调度,请问有人知道要怎么弄吗?
上面的汇编是我直接伪造返回现场让中断直接退出到我想要执行的调度函数RTTaskSchedule ,执行完调度函数RTTaskSchedule 后再执行函数IrqReturn返回到main中。但是这段代码并不能实现我想要的功能,被嵌套的调度函数RTTaskSchedule 不能正常返回了。
|