向勇的意见
- “执行器部分”中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的事件到期(比如时钟到期,按键事件发生)而被唤醒,设置为就绪态
运行态→就绪态:
当前正在执行的任务被抢占的时候,被抢占任务就会从运行态转为就绪态,而最高优先级任务(抢占任务)会从就绪态转为运行态。
就绪态→运行态:
当非就绪态任务等待的时间被触发,唤醒设置为就绪态后,如果其优先级高于当前运行任务的优先级,那么任务就会从就绪态继续的转变为运行态。
除此以外,当一个任务执行await后,会在执行器的poll函数中,重新找到新的最高优先级任务,将其从就绪态转为运行态进行执行。
5.异步任务的优先级如何指定和使用?这是需要讨论的问题。
这个在我们的测试代码里面可以看到:
传入第一个参数task是异步函数,第二个参数p_arg是异步函数传入的参数指针,第三个参数_ptos是如果用户之前创建了一个静态的栈的时候,可以传入该栈指针,这个栈会被stackallocator回收(默认按照128B回收),但是通常这个参数是用不上的,只是为了保持接口形式和ucosii一致,第四个参数是prio,表示了任务优先级。
下面是对应的异步任务的例子:
7.“ucosii的调度时间短于embassy_preempt”中的CPU频率是多少?这多出来的2us是什么情况?好像这个结果还有很大的改进空间。是吗?
这个2us应该是stk allocator导致的,调度过程中可能存在栈的分配。
8.Rust的bss比C的小许多,这个比较公平吗?直觉是,你的比较不公平。也许你可以直接比较相同功能的应用的elf大小。
这个是公平的。之所以c的bss比rust的多很多,是因为c的栈是静态分配的(未初始化),所以就放在了bss部分,而rust这边的栈是,embassy并不需要单独分配,而我们的embassy_preempt是用对分配动态初始化管理的,并不是在bss段,所以这里的bss大小区别是由于栈导致的,而对于embassy和embassy preempt的栈的大小的测量,我们由于没办法静态测量,就通过爆栈的方式逼近真实值(峰值)。所以我们比较只是列出了这一点,但是真正实施的比较的是各种手段测出来的相同情况下的ram开销:
测试对象测试 | embassy_preempt | ucosii | embassy |
最小RAM空间 | 24K | 40K | 12K |
静态空间 | ≈10K | ㅤ | ≈10K |
动态空间 | ≈14K | 32K | ≈2K |
同时下面这个表的最后也是总结了相同功能的应用elf大小(即总大小):
测试对象段(B,十进制表示) | embassy_preempt | ucosii | embassy |
.text | 40284 | 6284 | 50168 |
.data | 56 | 0 | 56 |
.bss | 10744 | 40904 | 10900 |
总大小 | 51084 | 47188 | 61124 |