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

问题描述 投票:1回答:2

因此,我目前正在研究针对嵌入式设备(Cortex m4)使用纯C ++ 17项目的可能性。但是基于它是嵌入式设备这一事实,我们拥有端口并使用RTOS 例如FreeRTOS或uc-OS,因此我非常希望使用std::thread(因此我们可以轻松地交换RTOS(如果需要)。有没有一种方法可以覆盖C ++中的线程类以使用依赖于平台的RTOS

提前感谢

c++ overriding freertos stdthread ucos
2个回答
0
投票

[没有办法告诉std::thread使用FreeRTOS::thread(已制成),但是您可以使用conditional compilation和类似的type alias

#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


0
投票

是否有一种方法可以覆盖C ++中的线程类以使用平台依赖的RTOS?

没有简单的方法可以这样做,但是@Arthur Passo指出,其他人已经尝试过这样做。即便这不仅仅是覆盖特定于OS的类,您还需要在需要特定于OS的调用时挂接toochain调用以查看FreeRTOS api。反过来,这又引发了许多问题,有关如何使事情在不同的编译器版本之间保持可维护性。

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

  1. 在大多数RTOS提供程序支持的CMSIS OS API

    之上,创建自己的C ++ OS抽象层(FreeRTOS,KeilRTX,Chibi支持它,我确信uc-OS也支持)。只要构建系统能够根据所使用的RTOS链接适当的文件,这便可以更轻松地将单个抽象与多个RTOS一起使用。同时,这为您提供了充分的灵活性来配置线程优先级,堆栈大小等,如果使用posix api之类可能无法实现。
  2. 在POSIX API上创建自己的C ++ OS抽象层。 FreeRTOS提供了POSIX API https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_POSIX/index.html,我敢肯定其他人也会有类似的变化。

© www.soinside.com 2019 - 2024. All rights reserved.