如何在 freeRTOS 上使用 std::thread?

Posted

技术标签:

【中文标题】如何在 freeRTOS 上使用 std::thread?【英文标题】:how to work with std::thread on freeRTOS? 【发布时间】:2021-02-05 22:54:48 【问题描述】:

我在带有 keil ide 和 arm 编译器版本 6 和 g++17 的 stm32f407 上使用 freeRTOS,我不喜欢使用 freeRTOS 线程 API。相反,我想使用 std::thread c++ 本机库。但是当我包含#include <thread> 时,keil 会抛出此错误:error: <thread> is not supported on this single threaded system

有什么问题?

当我有 freeRTOS 时,这意味着我的平台不是单线程的,那么为什么 keil 会抛出这个错误?

【问题讨论】:

C++ 标准库是否在 RTOS 上完全工作?它几乎不是“本地的”。您正在接近金属:使用操作系统为您提供的工具。 @AsteroidsWithWings 我现在有 3 个线程同时运行! (我用 freeRTOS API 创建了它们)。所以,这意味着它能够进行多线程。对吗? 不过,这并不是典型的 C++ 实现所能理解的。它可能正在寻找pthreads 或类似的东西。对于 FreeRTOS 安装来说,C++17 确实是一个非常特殊的选择。通常您会使用 C 语言并使用 FreeRTOS 功能。 @AsteroidsWithWings 所以你的意思是没有办法在 freeRTOS 上使用 c++ 线程库?我真的需要使用 c++ std::threads. @MahyarShokraeian 您需要实现std::thread 需要的所有操作系统绑定,即 POSIX pthread 函数。我记得我们曾经这样做过,但这不是一件容易的事,我们决定编写自己的线程抽象类,其语义基本相同。这种抽象我们至少可以为我们开发的其他基于 µLinux 的系统保留大部分代码的可移植性。互斥体、信号量和其他相关的东西也是如此。 【参考方案1】:

这并不是关于 C++17 本身,而是关于编译器/STL 功能支持,例如FreeRTOS 平台。你知道,必须有人为某个操作系统平台实现血淋淋的低级细节,以提供兼容的 std::thread 接口。这同样适用于 std::mutex 和其他所有需要操作系统支持的相关功能。因此,您必须要求您的(交叉)编译器提供商使用例如构建一个。对 FreeRTOS 的 std::thread 支持。

【讨论】:

感谢您的回答!但是如何让我的编译器为 FreeRTOS 构建 std::thread 支持? @HS2 “所以你必须要求你的(交叉)编译器提供商构建一个,例如 std::thread 支持 FreeRTOS。” i> 请注意,大多数人只是使用 GCC 来处理那些 ARM 衍生产品。 我也在使用 GCC,这是来自 ARM 的 bare metal 二进制发行版。 Bare metal 意味着没有内置专门的操作系统支持。因此我们根本无法使用某些 C++17 功能,而必须使用本机 RTOS API。 @Mahar您可以向Keil索要,但我怀疑是否愿意或能够这样做。这是一项艰苦的工作,需要花费很多钱,而且他们必须再次为他们的 RTX 操作系统做同样的事情......【参考方案2】:

我们中的许多人只是为 FreeRTOS API 推出自己的 C++ 包装器,或者将 FreeRTOS 调用合并到对大多数应用程序隐藏的类中。你可能想看看这个,它主要是你要找的东西:https://www.codeproject.com/Articles/1278513/Cplusplus11-FreeRTOS-GCC

【讨论】:

【参考方案3】:

Keil 会抛出该错误,因为您将应用程序链接到不支持 API 的库。

有一个 freeRTOS POSIX threading wrapper 您可以评估使用,或者您可以在 CMSIS OS API 之上创建另一个抽象层。

还有一个 C++ 包装器项目 freeRTOS-addons,它提供了一组方便的类/API,但它多年来一直处于非活动状态。

在使用包装器之前,必须评估为什么要使用 RTOS,如果它的确定性和任务优先级机制不会被使用,因为同等优先级的任务将共享 CPU 时间。当然,还有其他好处。

【讨论】:

以上是关于如何在 freeRTOS 上使用 std::thread?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定使用 FreeRTOS xTaskCreate 创建单个任务所需的 Stackdepth?

移植FreeRTOS到STM32

移植FreeRTOS到STM32

移植FreeRTOS到STM32

FreeRTOS学习笔记 ——二值信号量

FreeRTOS学习笔记 ——二值信号量