Hello everyone, 我是图卢兹大学的软件定义电力电子研究人员Luiz Villa。我的团队正在努力将实时操作系统嵌入到微控制器上,以便在电力电子领域创建一个更加友好的嵌入式控制开发过程。我们正尽量避免使用ISRs,原因有二:
它使软件开发中的协作变得更容易(我们的项目是open-source)
)。
我们想在Zephyr和RIOT之间建立一个线程速度的基准。我们需要一个以20 that的速度运行的代码,其中有2到3个线程执行:
控制averaging
)
由于时间对我们来说是如此重要的因素,我们需要知道:
我们的初步结果表明:
。
我们使用Nucleo-G474RE,代码如下:https://gitlab.laas.fr/owntech/zephyr/-/tree/test_adc_g4
我们对我们的结果感到非常惊讶,因为我们预计这两个操作系统所消耗的资源都会比它们少得多。
你认为如何?你试过尽可能快地运行这些操作系统吗?你的结果是什么?你测试过Zephyr的换线时间吗?
Thanks for reading
Luiz 发布于 2021-04-08 08:25:42
免责声明:我是一个防暴核心开发人员。
:在Zephyr和RIOT中切换线程所需的时间?当用单线程测试时,睡眠时间为0us时,Zephyr的测试周期为9 5us和riot 5us。
这似乎是对的。
如果我在核-f401re(84 M4 STM32F4 / Cortex-M4)上运行一个自己的调度微基准(例如,tests/bench_mutex_pingpong),结果是:
main(): This is RIOT! (Version: 2021.04-devel-1250-gc8cb79c)
main starting
{ "result" : 157303, "ticks" : 534 }测试测量一个线程切换到另一个线程和返回线程的次数。一次迭代(两个上下文开关)需要534个时钟周期,即1000000/154303 = ~6.36us,接近于您得到的数字。
这是上下文切换开销。线程的寄存器和状态存储在它的堆栈中,调度程序运行以确定下一个可运行的线程,并恢复该线程的寄存器和状态。
我很惊讶泽弗尔没能接近暴乱。可能检查它是在优化启用的情况下编译的,还是一些启用的特性增加了切换开销(例如,MPU是否已启用?)
在Zephyr和RIOT中执行线程的最短时间是多少?
在ISR服务和上下文切换之后剩下的东西。
,你觉得呢?
有三个线程排定在20千赫,并让他们做实际的工作将是紧密的一个Cortex-M在泽菲尔或暴乱,所以我认为你应该重新构建你的应用程序。有多个线程在逻辑上分离它们是非常好的,但是在这里,一个经典的主循环可能是一个更好的选择。
类似的东西(伪代码):
void loop() {
while(1) {
handle_adc();
do_dsp_computation();
send_data();
periodic_sleep_us(50);
}
}https://stackoverflow.com/questions/66473898
复制相似问题