向勇的意见
- “执行器部分”中interrupt poll环节的压栈操作感觉并不经济。这导致任务切换时可能还会回收刚分配的栈。有这种可能吗?
- 在“thread poll loop”中,当没有就绪任务时,可以把CPU置于休眠状态吗?
- 你的任务状态有哪几种?在什么情况下会变化?
- “如何统一异步任务与同步任务?”中的描述有些不清晰。这一部分改好了,可以成为技术的亮点。有时间吗?
- 异步任务的优先级如何指定和使用?这是需要讨论的问题。
- “性能测试”中的实时性测试可以补充不同延时长度下的测试吗?我想知道定时和唤醒的最高精度。
- “ucosii的调度时间短于embassy_preempt”中的CPU频率是多少?这多出来的2us是什么情况?好像这个结果还有很大的改进空间。是吗?
- Rust的bss比C的小许多,这个比较公平吗?直觉是,你的比较不公平。也许你可以直接比较相同功能的应用的elf大小。
1. “执行器部分”中interrupt poll环节的压栈操作感觉并不经济。这导致任务切换时可能还会回收刚分配的栈。有这种可能吗?
这是不可能的。在中断环节的压栈是对即将调度的任务,在它本身没有栈的时候进行的压栈,刚分配的栈是用于新调度的任务的执行所需要的,在后续任务真正切换过程(pendsv),回收栈的时候,只是在原任务是await而来,不需要保存现场的时候,将原任务所使用的公共程序栈(协程共同使用)给回收,这个栈不可能和分配给即将被调度的任务的栈相同。
2.在“thread poll loop”中,当没有就绪任务时,可以把CPU置于休眠状态吗?
对的。我们将休眠状态设置统一到prio为63(最低优先级)的idle任务上,此任务就是循环执行wfe,使得CPU在休眠状态,在移植到其它的开发板上时,也只需要更改这个地方,将其设定为对应芯片的休眠状态指令即可。
3.你的任务状态有哪几种?在什么情况下会变化?
只有就绪态和非就绪态,严格来说,还设置了一个curprio变量用于标识运行态(只有正在运行的任务处于运行态)
就绪态→非就绪态:
任务在执行过程中(处于就绪态),由于await导致任务需要让权的时候,会设置其为非就绪态。
ps:任务在执行过程中,如果被其它任务抢占,那么并不会设置原任务(被抢占)为非就绪,仍然保持其为就绪态等待被调度
非就绪态→就绪态:
任务在非就绪状态时,会因为之前await的事件到期(比如时钟到期,按键事件发生)而被唤醒,设置为就绪态