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

问题描述

我在带有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本身无关,而与所有编译器/ STL功能的支持有关,例如FreeRTOS平台。您知道,某人必须为某个OS平台实施复杂的低级详细信息,才能提供兼容的std :: thread接口。这同样适用于std :: mutex和其他所有需要操作系统支持的相关功能。因此,您必须要求(交叉)编译器提供商使用以下方法构建一个提供商。对FreeRTOS的std :: thread支持。

,

我们中的许多人只是为 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,它提供了一组方便的类/API,但它已经多年不活跃了。

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