我想通过SysTick的嵌套自身,实现任务的抢占式调度,请问有人知道要怎么弄吗? 上面的汇编是我直接伪造返回现场让中断直接退出到我想要执行的调度函数RTTaskSchedule ,执行完调度函数RTTaskSchedule 后再执行函数IrqReturn返回到main中。但是这段代码并不能实现我想要的功能,被嵌套的调度函数RTTaskSchedule 不能正常返回了。 |
据我所知,ARM中断并不支持自己嵌套自己,或许会因为标志清零延时问题导致刚退出去后发生重进。 当然,你这里说的嵌套,应该说只是模拟类似操作不是真的自己嵌套,这样原理上个人觉得没有大问题,但要求对压栈出栈操作及相关寄存器很清晰,否则比较难以玩转。 不过真心期待你能成功搞定。 另外,不同优先级任务本身不就支持抢占吗?为什么要如此费周章?
什么叫嵌套自身?难以理解
什么叫嵌套自身?难以理解
就是第一个中断函数还没执行完,又来了中断,这时候又再一次执行中断函数。
第一次进中断,压栈。
第一次进中断,压栈。
哥们,细说,多谢哈。
就是第一个中断函数还没执行完,又来了中断,这时候又再一次执行中断函数。 ...
如果你说的是同一中断,那不是出不来了么?
freertos用的是中断抢占式,可以参考freertos的使用。407是修改中断组号来实现开启抢占式中断模式,具体的使用建议参考对应芯片手册中关于中断配置的部分。
freertos用的是中断抢占式,可以参考freertos的使用。407是修改中断组号来实现开启抢占式中断模式,具体的 ...
哥们仔细看,我要实现的是当前在执行的中断嵌套自身,不是其它的中断来抢占。
楼主是不是想得到类似函数递归一样的效果,函数实现递归(自己调用自己)是完全没问题的,但是同一个中断调用同一个中断似乎无法实现,因为正在响应systick中断时,arm的nvic的active interrupt寄存器中该中断是置位的,此时再来的systick中断,抢占优先级并没有改变,应该不会挂起当前的systick中断,转而响应新来的systick中断。
哥们仔细看,我要实现的是当前在执行的中断嵌套自身,不是其它的中断来抢占。 ...
首先你要理解中断产生的原理,即便是正常程序操作,在使用各种rtos时,都会增加互斥。只有中断抢占可以打断其他中断而执行,但是中断自己不会抢占自己。除非是你用其他的中断调用的函数和你目前使用的函数是一个。比如你把.s中不同的中断,修改使用同一个函数。
哥们仔细看,我要实现的是当前在执行的中断嵌套自身,不是其它的中断来抢占。 ...
既然是想做到任务的抢占式调度,可以参考freertos的任务调用。
既然是想做到任务的抢占式调度,可以参考freertos的任务调用。
要是参考freeRTOS的内核来,那我直接用freeRTOS不就完事了吗。现在就是想减少调度器的复杂度,以前在51单片机上就是就用中断嵌套自身来调度的,任务调度函数代码贼少。
楼主是不是想得到类似函数递归一样的效果,函数实现递归(自己调用自己)是完全没问题的,但是同一个中断调 ...
是的,有点类似递归。这个调度方案就是通过进入中断硬件的压栈和出栈实现抢占式调度,我在m3内核上已经实现了;这个抢占式调度以前在51上用得贼多。
如果你说的是同一中断,那不是出不来了么?
是有无法返回堆栈溢出的风险,这就需要程序员自己去管理任务的执行时间了,比如有task_1ms、task_5ms两个周期执行的任务,task_1ms任务必须在1ms的时间内执行完,否则堆栈溢出;task_5ms任务必须在5ms内执行完(这5ms既要每1ms执行一次task_1ms,还要把task_5ms执行完,剩余的cpu时间去跑主函数main的循环。)