修改idle

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的差距。