修改“统一同步任务与异步任务”部分报告
完善embassy_preempt线程的测试(设置更高间隔,跑到delay,测出去掉栈分配的情况)
修改idle任务
修改idle
idle任务被抢占的时候,是不需要保存上下文的。可以直接poll新的任务执行
判断到,如果抢占的是idle,在interrupt poll那里,就不会分配栈,并且保持当前任务为thread mode,然后模拟压栈,然后在pendsv那里,会先在判断到cur prio为63的时候设置不回收原来栈
测试数据
ㅤ | embassy_preempt协程模式 | embassy_preempt线程模式 | ucosii |
调度时间 | 10.125us | 7.125us | 6.625us |
- 线程模式:
- 从调用IntCtxSw至触发PendSV中断耗时2.875us
- PendSV执行时间为2.125us
- 从PendSV执行结束至任务执行所花费的时间为0.375us
- 协程模式:
- 从调用IntCtxSw至触发PendSV中断耗时
- 若抢占idle任务:4us
- 若抢占普通任务:4.875us
- PendSV执行时间为2us
- 从PendSV执行结束至执行任务Poll_Fn所花费的时间为0.75us
- 从Poll_Fn至任务被执行花费1.5us
结论: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的差距。