嵌入式设备 -> std::thread -> FreeRTOS?



所以目前我正在研究将纯C++17项目用于嵌入式设备(Cortex m4(的可能性。但是基于它是一个嵌入式设备的事实,我们有端口并使用RTOS例如FreeRTOS或uc-OS,我非常喜欢使用std::thread(因此,如果需要,我们可以轻松更换RTOS(。有没有办法覆盖C++中的线程类以使用依赖于平台的RTOS?

提前致谢

有没有办法覆盖线程类C++以使用该平台 依赖实时操作系统?

没有简单的方法可以做到这一点,但正如@Arthur Passo所指出的那样,其他人已经尝试这样做。即使这样也不是简单地覆盖操作系统特定的类,相反,您需要在需要操作系统特定调用时挂钩 toochain 调用以查看 FreeRTOS api。这反过来又会引发许多关于在不同编译器版本之间保持可维护性的问题。

由于几个月前我一直在做类似的调查,我认为最好的解决方案是以下之一。(鉴于维护的灵活性和便利性,我个人会坚持选项 1(。

  1. 在大多数RTOS提供商支持的CMSIS OS API之上创建自己的C++操作系统抽象层(FreeRTOS,KeilRTX,Chibi支持它,我相信uc-OS也可以(。这样就可以更轻松地将单个抽象与许多 RTOS一起使用,只要您的构建系统能够根据所使用的 RTOS 链接正确的文件。同时,这使您可以完全灵活地配置线程优先级,堆栈大小等,如果您使用posix api之类的东西,则可能无法实现。

  2. 在 POSIX API 之上创建您自己的C++操作系统抽象层。FreeRTOS 提供了一个 POSIX API https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_POSIX/index.html,我相信其他人也会有类似的变体。

没有办法告诉std::thread使用useFreeRTOS::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

n owthread_t将是实现中的线程类型,如果未找到符号,则回退到std::thread

相关内容

  • 没有找到相关文章

最新更新