【问题标题】:How to connect C++ system calls to freertos如何将 C++ 系统调用连接到 freertos
【发布时间】:2020-09-26 04:14:31
【问题描述】:

我想用 free-rtos 为微控制器编写一个多线程程序。但我不想使用非标准的 free-rtos 函数,而是想使用原生 c++ 库来运行并行和异步任务。但我不知道如何编写一个适配器,用于将用于创建线程的 c++ 系统调用连接到 free-rtos 函数。

mcu: 手臂皮质 m4 stm32f407

c++ 版本:17

【问题讨论】:

  • 第三种选择是使用标准 C++ 线程库。
  • @TedLyngmo 我认为您的建议正是 OP 想要做的。挑战可能在于 C++ 标准库实现依赖于 POSIX 线程,但 RTOS 通常具有非 POSIX 的本机线程 API
  • @marko 我可能误解了 OP 想要什么。应该不需要编写适配器。标准库应包含所需的所有抽象,并且可以免费使用 pthread 或本机 API 中可用的任何东西。
  • @marko 我的项目在微控制器上并且没有任何操作系统,所以像 std thread 或 pthread 这样的库在没有操作系统的情况下将无法正常工作,正如你所说的那样,对吗?所以我将 free-rtos 添加到我的项目中以使用多线程,但是一些库使用本机 c++ 线程或 pthread 库,它们不能与 free-rtos 函数一起使用。所以我需要以某种方式将 std 线程库连接到 free-rtos 函数。正确的?我只是想知道我该怎么做
  • @MahyarShokraeian 你想要什么是不可能的!不过,您可以在 FreeRTOS 上编写一个包装器作为其上层。

标签: c++ arm microcontroller freertos bare-metal


【解决方案1】:

标准定义了一个接口,它指定了语法,可能会定义一些对其性能的要求,但它不会定义如何实现任务调度器,这是编译器的职责。

实际上,std::thread 通常是这样的,它使用来自操作系统(或更低层)的线程并依赖于它们的包装器。如果你有一个兼容 C++11 的编译器来包含 std::thread,显然你不需要做任何事情。否则,您必须编写自己的抽象层或使用其他人编写的包装器,互联网上有很多想法,即:https://www.codeproject.com/Articles/1278513/Cplusplus11-FreeRTOS-GCC

【讨论】:

    【解决方案2】:

    FreeRTOS 似乎有一个POSIX threads adaptor 层。它是一个子集,但可能足以从 GNU libstdc++ 或 clang libc++ 构建 threadmutexfuture。您几乎肯定需要一个有效的std::atomic 实现。

    POSIX 线程中有很多漏洞是由于它对各种类似 UNIX 的操作系统的改造而产生的,而且您很可能不希望这些位不受支持。有充分的理由,它不是许多 RTOS 的默认线程 API。

    【讨论】:

    • 在他的问题中,他在哪里谈到了 POSIX 适配器?根据他的问题,他似乎想要一个与 FreeRTOS 一起使用的特殊 C++ 库std :: thread。除了 POSIX 是一个C API 集这一事实之外,std::thread 和 POSIX 在它们的 API 上也有很多不同之处。无论如何,他已经确认了这个答案,真是太好了!
    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 2017-11-20
    • 2016-02-09
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多