向勇的意见

  1. “执行器部分”中interrupt poll环节的压栈操作感觉并不经济。这导致任务切换时可能还会回收刚分配的栈。有这种可能吗?
  1. 在“thread poll loop”中,当没有就绪任务时,可以把CPU置于休眠状态吗?
  1. 你的任务状态有哪几种?在什么情况下会变化?
  1. “如何统一异步任务与同步任务?”中的描述有些不清晰。这一部分改好了,可以成为技术的亮点。有时间吗?
  1. 异步任务的优先级如何指定和使用?这是需要讨论的问题。
  1. “性能测试”中的实时性测试可以补充不同延时长度下的测试吗?我想知道定时和唤醒的最高精度。
  1. “ucosii的调度时间短于embassy_preempt”中的CPU频率是多少?这多出来的2us是什么情况?好像这个结果还有很大的改进空间。是吗?
  1. 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导致的,调度过程中可能存在栈的分配。
notion image

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
Loading...
liamY
liamY
Chasing Possible
最新发布
Enter AMX (Advanced Matrix Extensions)
2025-3-26
ktransformers相关内容学习
2025-2-16
sglang_benchmark
2025-2-7
SnapKV: LLM Knows What You are Looking for Before Generation
2024-12-12
数字电路复习
2024-12-11
CacheBlend: Fast Large Language Model Serving with Cached Knowledge Fusion论文学习
2024-11-23
公告
🎉Liam’s blog🎉
-- 全新上线 ---
👏欢迎comment👏
⚠️由于浏览器缓存的原因,有些内容是更新了的但是需要手动刷新3次左右,页面才会显示更新内容