[zephyr-rtos][riot-os] Zephyr 与 RIOT OS

问题描述

  Hello everyone,

我是图卢兹大学软件定义电力电子学研究员 Luiz Villa。我的团队正在尝试将 RTOS 嵌入到微控制器中,以创建更友好的电力电子嵌入式控制开发过程。 我们正在尽可能避免使用 ISR,原因有两个:

  • 它使软件开发中的协作更容易(我们的项目是开源的)
  • 中断使代码执行时间不确定(我们希望避免这种情况)

我们想在线程速度方面在 Zephyr 和 RIOT-OS 之间建立一个基准。我们需要一个以 20kHz 运行的代码,其中有两到三个线程:

  • ADC 采集和数据平均
  • 控制的数学计算(使用 CMSIS)
  • 与外界的沟通

由于时间对我们来说是如此重要,我们需要知道:

  • 在 Zephyr 和 RIOT-OS 中执行线程的最短时间是多少?
  • 在 Zephyr 和 RIOT-OS 中切换线程所需的时间?

我们的初步结果表明:

  • 在使用单线程和 0us 的睡眠时间进行测试时,Zephyr 的周期为 9us,而 riot 为 5us
  • 在使用单线程和 10us 的睡眠时间进行测试时,Zephyr 的周期为 39us,riot 为 15us

我们使用带有以下代码的 Nucleo-G474RE:https://gitlab.laas.fr/owntech/zephyr/-/tree/test_adc_g4

我们对我们的结果感到非常惊讶,因为我们预计这两个操作系统消耗的资源都比它们少得多。

你怎么看?您是否尝试过尽可能快地运行这些操作系统中的任何一个?你的结果如何?你测试过Zephyr的线程切换时间吗?

  Thanks for reading
        Luiz 

解决方法

免责声明:我是 RIOT 核心开发人员。

在 Zephyr 和 RIOT-OS 中切换线程所需的时间?

单线程测试时,休眠时间为0us,Zephyr的周期为9us,riot 5us

这似乎是正确的。

如果我在 nucleo-f401re(84MHz STM32F4 / Cortex-M4)上运行 RIOT 自己的调度微基准测试之一(例如,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,这与您得到的数字很接近。

这是上下文切换开销。一个线程的寄存器和状态存储在它的堆栈中,调度器运行以找出下一个可运行的线程,并恢复该线程的寄存器和状态。

我很惊讶 Zephyr 并没有更接近 RIOT。也许检查它是否是在启用优化的情况下编译的,或者某些启用的功能是否会增加切换开销(例如,是否启用了 MPU?)。

在 Zephyr 和 RIOT-OS 中执行线程的最短时间是多少?

在提供 ISR 并切换上下文后还剩下什么。

你怎么看?

在 Zephyr 或 RIOT 上使用 Cortex-M 以 20KHz 的频率安排三个线程并让它们执行实际工作会很紧张,所以我认为您应该重新构建您的应用程序。 使用多个线程在逻辑上分隔它们非常好,但在这里经典的主循环可能是更好的选择。

像这样(伪代码):

void loop() {
  while(1) {
    handle_adc();
    do_dsp_computation();
    send_data();
    periodic_sleep_us(50);
  }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...