所以目前我正在研究将纯C++17项目用于嵌入式设备(Cortex m4)的可能性。但基于它是嵌入式设备的事实,我们有端口并使用RTOS ,例如 FreeRTOS 或 uc-OS,我非常喜欢使用它(因此,如果需要,std::thread
我们可以轻松更换RTOS )。有没有办法覆盖C++中的线程类以使用平台依赖的RTOS?
提前致谢
所以目前我正在研究将纯C++17项目用于嵌入式设备(Cortex m4)的可能性。但基于它是嵌入式设备的事实,我们有端口并使用RTOS ,例如 FreeRTOS 或 uc-OS,我非常喜欢使用它(因此,如果需要,std::thread
我们可以轻松更换RTOS )。有没有办法覆盖C++中的线程类以使用平台依赖的RTOS?
提前致谢
有没有办法覆盖 C++ 中的线程类以使用依赖于平台的 RTOS?
没有简单的方法可以做到这一点,但正如@Arthur Passo 所指出的,其他人已经尝试过这样做。即使这不是简单地覆盖特定于操作系统的类,而是需要挂钩 toochain 调用以在需要特定于操作系统的调用时查看 FreeRTOS api。这反过来又会引发很多关于在不同编译器版本之间保持可维护性的问题。
由于几个月前我一直在进行类似的调查,我认为最好的解决方案是以下之一。(考虑到维护的灵活性和便利性,我个人会坚持选项 1)。
在大多数 RTOS 提供商支持的CMSIS OS API之上创建自己的 C++ OS 抽象层(FreeRTOS、KeilRTX、Chibi 支持它,我相信 uc-OS 也支持它)。只要您的构建系统能够根据所使用的 RTOS 链接正确的文件,这使得将单个抽象与多个 RTOS 一起使用变得更加容易。同时,这使您可以充分灵活地配置线程优先级、堆栈大小等。如果您使用诸如 posix api 之类的东西,这可能是不可能的。
在 POSIX api 之上创建自己的 C++ OS 抽象层。FreeRTOS 提供了一个 POSIX API https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_POSIX/index.html,我相信其他人会有类似的变体。
没有办法告诉std::thread
使用 use FreeRTOS::thread
(编造这个),但你可以使用条件编译和类型别名,如
#ifdef FREE_RTOS // you will need to get the correct symbol from the implementation to check for
using thread_t = FreeRTOS::thread // you will need to use the correct type here
#elif defined(OTHER_RTOS)
using thread_t = OtherRTOS::thread
#else
using thread_t = std::thread
#endif
现在将是实现中的线程类型,如果没有找到符号则thread_t
回退到。std::thread