首页 > 编程知识 正文

触发机制设置,征服者触发机制

时间:2023-05-04 10:25:44 阅读:165893 作者:1585

FREERTOS已移植到ARM Cortex-A9

触发任务调度的机制有两个中断

1.ostaskrun/ostasksaverun/ostaskloadrun/ostasksaveloadrun

该机制通过调用软中断ARM SWI异常触发任务切换。

软中断呼叫:

#defineOstaskrun(pruntCB ) osek_switch_type=1; __ASMvolatile(SWI0); #defineostasksaverun(psavedtcb,PRunTcb ) osek_switch_type=1; __ASMvolatile(SWI0); #defineOstaskloadrun(pruntCB ) osek_switch_type=0; __ASMvolatile(SWI0); # defineostasksaveloadrun (psavedtcb,PRunTcb ) osek_switch_type=0; __ASMvolatile(SWI0); 软中断响应:

. align 4.type OSEK_SWI_Handler,% functionosek _ swi _ handler 3360/* swivectorhandler */port save _ contextldrr 例如,不能在任务完成后调度下一个任务TerminateTask,在中断程序中直接调用软中断进行上下文切换。 Darwin OSEK不使用循环嵌套,因此无法在需要切换任务的地方直接在一个中断中直接调用SWI中断。 在这种情况下,必须采用第二种IRQ handler方法。 也就是说,不允许在某种中断中发生任务调度。 例如,在某种中断中发生两种中断的情况下,两种中断会激活某个优先顺序高的任务t,任务的状态从suspended变为ready,但是在这种情况下,任务t不被安排在任务调度程序上,而是进行下一个调度Darwin2 OSEK没有使用中断嵌套。 如图1所示,不允许在timer中断中调用软中断__asm volatile (“SWI 0”)来调度任务。 由于timer中断过程尚未完成,因此一些资源仍在关键节中,如果直接进入另一个中断,关键节资源将无法同步。 正确的做法是在这次的timer中断中只是激活任务,在结束这次的timer中断的流程后,等待下一个调度点再调度任务。 例如,在图2的IRQ中断中调度任务;

2.IRQ handler

是否需要切换任务由tick中断检测,检测频率为1ms。 当处理IRQ中断时,检测是否需要切换isScheduleRequired,并在需要切换时跳转至切换处理程序switch_before_exit; isScheduleRequired在任务活动且需要切换任务的地方打开,如OSActivateTask或OSSetEvent。

. align 4.type OSEK_IRQ_Handler,% functionosek _ IRQ _ handler 3360/* swivectorhandler */. /其他处理LDRr1,=iii

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。