idle任务被抢占的时候,是不需要保存上下文的。可以直接poll新的任务执行
判断到,如果抢占的是idle,在interrupt poll那里,就不会分配栈,并且保持当前任务为thread mode,然后模拟压栈,然后在pendsv那里,会先在判断到cur prio为63的时候设置不回收原来栈
embassy_preempt协程模式 | embassy_preempt线程模式 | ucosii | |
---|---|---|---|
调度时间 | 10.125us | 7.125us | 6.625us |
结论:embassy_preempt的协程模式相较于线程模式(线程模式与ucosii的耗时几乎相同),多余的步骤为模拟压栈(额外耗时:4-2.875=1.125us),跳板函数闭包(模拟压栈时对应PC的闭包)以及poll_fn的调用(额外耗时:1.5+0.75-0.375=1.875us)。最终导致的总耗时为3us,这也就是embassy_preempt协程模式与embassy_preempt线程模式与ucosii的差距。