微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决[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);
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。