STM32
直播中

乔丽娜

7年用户 1107经验值
私信 关注
[问答]

如何实现SysTick中断的嵌套自身?


  • 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 不能正常返回了。

回帖(1)

王博

2024-3-25 10:56:13
据我所知,ARM中断并不支持自己嵌套自己,或许会因为标志清零延时问题导致刚退出去后发生重进。

当然,你这里说的嵌套,应该说只是模拟类似操作不是真的自己嵌套,这样原理上个人觉得没有大问题,但要求对压栈出栈操作及相关寄存器很清晰,否则比较难以玩转。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分