游客发表
2020年第20期《电子技术与软件工程》刊登了一篇关于嵌入式系统实时调度的电技第期改进方案,作者来自杭州某高校的术软实验室。这篇论文解决了一个具体问题:在工业控制场景下,程年Linux内核的电技第期CFS调度器对周期性实时任务的响应延迟波动较大,平均在1.2毫秒左右,术软峰值能到4毫秒以上。程年对于运动控制卡这类需要微秒级抖动的电技第期应用,这个数字显然不够看。术软
他们的程年做法不是从头写一个RTOS,那太费劲了。电技第期而是术软在CFS的红黑树结构上做文章,引入了一个“时间片预算”机制。程年简单说,电技第期每个实时任务在唤醒时,术软调度器会检查它过去三个周期内的程年实际执行时间。如果超过预设值的80%,就临时提高它的虚拟运行时间权重。这个改动只有两百多行代码,但测试结果挺有意思——在四核ARM Cortex-A53平台上,用cyclictest跑下来,最大延迟降到了800微秒以内。当然代价也有,非实时任务的吞吐量下降了约7%。作者自己也承认,这属于“用通用性换确定性”的折中。
我翻过这一期的目录,同期还有几篇讲FPGA硬件加速和5G网络切片资源分配的。相比之下,这篇调度改进的文章更接地气。它没有堆砌复杂的数学公式,反而花了三页篇幅讲他们怎么用示波器抓GPIO翻转波形来验证延迟。这种实验方法在软件工程期刊里不多见,倒像是硬件工程师的手笔。文中有一处细节:他们发现当CPU频率从1.2GHz降到800MHz时,改进算法的延迟优势反而更明显,从原来的35%提升到了52%。这暗示了算法对频率变化不敏感,但作者没展开解释,算是个小遗憾。
软件工程领域有个老毛病,很多论文的“实验验证”部分只跑仿真,不碰真实硬件。这篇至少老老实实搭了测试台,用了Xilinx Zynq板子,还对比了三种不同负载下的表现。不过他们的对比基准选的是标准CFS和SCHED_FIFO,没跟Xenomai或PREEMPT_RT打补丁的内核比。这让人有点怀疑,毕竟后者在工业界更常用。或许作者觉得那些方案改动太大,不适合嵌入式场景?文章结尾提到下一步会尝试跟cgroup v2集成,但没给时间表。
读这种应用型论文,我习惯先看它的“局限性”段落。这篇写得很实在,承认在高负载(CPU利用率超过90%)时,改进算法反而比原生CFS差,因为频繁的权重调整增加了调度器自身的开销。这个坦诚值得肯定。另外,他们只在ARMv8上测了,没说x86或RISC-V会怎样。考虑到2020年RISC-V还没现在这么火,倒也情有可原。
整篇文章六页,图表占了近两页。公式只有三个,都是简单的加权平均。如果你正在做工业网关或机器人控制器,需要软实时但不想换RTOS,这篇值得翻翻。代码没开源,但算法描述足够清晰,照着实现应该不难。唯一要留意的是,他们的测试用例里任务周期最小是500微秒,如果你的系统要求更短,比如100微秒,那这套方案可能不适用——红黑树的插入操作本身就有开销。
友情链接