0
  Hello everyone, 

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

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

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

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

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

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

我们的初步结果表明:

  • 单线程测试时睡眠时间为0us,Zephyr的周期为9us,暴动为5us
  • 单线程测试时sleep时间10us,Zephyr周期39us,riot 15us

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

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

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

  Thanks for reading
        Luiz 
4

1 回答 1

1

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

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

单线程测试时睡眠时间为0us,Zephyr的周期为9us,暴动为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);
  }
}
于 2021-04-08T08:25:42.657 回答