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

how to work with std::thread on freeRTOS?

我在带有 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++17 本身,而是关于 compiler/STL 功能支持,例如FreeRTOS 平台。您知道,必须有人为某个 OS 平台实现血淋淋的低级细节,以提供兼容的 std::thread 接口。这同样适用于 std::mutex 和其他相关功能,它们都需要 OS 支持。因此,您必须要求您的(交叉)编译器提供商使用例如构建一个std::thread 支持 FreeRTOS。

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

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

的库

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

还有一个 C++ 包装器项目 freeRTOS-addons,它提供了一组方便的 classes/APIs,但它已经停用多年了。

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