Multithreading 裸机嵌入式设备上的线程

Multithreading 裸机嵌入式设备上的线程,multithreading,arm,pthreads,bare-metal,Multithreading,Arm,Pthreads,Bare Metal,裸机arm设备上是否支持线程(或pthreads)。我使用的是ARM/GNU C++(ARM-none-eabi-g++)编译器,编译时出现错误“找不到-lpthread”,尽管我在linker命令中给出了-lpthread标志。如果没有支持抢占式多任务处理的操作系统,就没有线程。这就是术语“裸金属”所指的 g++和链接器都不能提供线程功能。只有操作系统才能提供线程 当然,您可以在自己的裸机应用程序中构建自己的线程处理,但这是一项艰巨的任务 中断例程通常抢占裸机设备上的主程序,可以认为是周期性触

裸机arm设备上是否支持线程(或pthreads)。我使用的是ARM/GNU C++(ARM-none-eabi-g++)编译器,编译时出现错误“找不到-lpthread”,尽管我在linker命令中给出了-lpthread标志。

如果没有支持抢占式多任务处理的操作系统,就没有线程。这就是术语“裸金属”所指的

g++和链接器都不能提供线程功能。只有操作系统才能提供线程

当然,您可以在自己的裸机应用程序中构建自己的线程处理,但这是一项艰巨的任务


中断例程通常抢占裸机设备上的主程序,可以认为是周期性触发的线程。一个周期性的定时器中断可以用来切换线程上下文。这是迈向抢占式多任务操作系统的第一步。

如果您不需要真正的pthreads(只是您不知道其他技术),那么协同路由可能是您的解决方案

coroutine是一个可以暂停执行以便稍后恢复的函数。协同路由是无堆栈的:它们通过返回调用方来暂停执行,恢复执行所需的数据与堆栈分开存储。这允许异步执行顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途

简单来说,它是介于函数和线程之间的东西。您不必像常规函数一样等待它们完成执行,也不必成为操作系统的一部分(FreeRTOS是一个操作系统)就可以拥有线程(pthread或其他)功能

这是一个新的C++20特性,您可以在嵌入式工具链上支持它。然而,有一篇关于用C语言实现它们的博文

我不包括博客的内容,因为这不是一个小片段,但我制作了一个多余的快照,以防原始网站崩溃:


您使用的是哪种设备?你真的用的是裸机吗?或者你有一个简约的操作系统?你计划线程是为了什么?我使用的是Microchip的SAML11SAML11附带晶体加速器。我想在加密加速器上运行一个线程,在主处理器上运行另一个线程。数据表表明,这只是他们为您放入rom中的一些代码,这意味着您可以使用任何mcu和库,只需使用可以在超级循环中轻松切片的代码。如果他们有硬件加速,我想他们会有不同的措辞,假设我没有阅读每一页…你能解释一下“在你自己的裸机应用程序中构建你自己的线程处理”是什么意思吗。除了线程之外,还有其他方法可以让crytographic accelerator和主处理器同时工作吗?即使在裸机上,也可以让东西并行或伪并行运行,例如所有中断例程都是伪并行运行的。当然,您可以将工作转移到其他硬件上,如加密协处理器。只需开始加密工作,同时在主处理器上执行其他操作,稍后再进行同步。您可以进行协作多任务处理(也称为光纤或协同路由)如果您认为这有什么用。@Mehreen您可以在您的平台上实现抢占式多任务处理,例如:您可以从主程序启动多个任务,就像在Linux或Windows等通用操作系统上启动多个线程一样,但是使用不同的API。但是freertos并不意味着裸机……任务要发生这两件事并不难,如果你愿意,你确实需要切换任务,但这可以很简单,因为你的非加密代码在周期性中断中运行,你限制它的执行时间,为加密任务留出一定的百分比。或者你只是等待加密完成。。。你也可以检查价格,使用较小的部件,有两个部件,一个用于加密,另一个用于其他所有部件。对于裸机(甚至所有其他)用例,这是一个很好的建议。协同程序本质上是协作式多任务处理。您可以使用stack和stackless。不过,我不确定指向C++20协同程序的指针是否有用。我最近查看了规范,它似乎非常复杂。但一些低级RTOS支持协同路由,有时称之为“任务”,所以在谈到裸机时,这是一个很好的观点+1Thanks曾经考虑过longjump setjump,如何将它与一个小型的嵌入式集中调度程序一起使用,在没有操作系统的情况下将一些东西带到裸机上,但是,拥有奇特的裸机应用程序和非常简化的操作系统之间的界线在哪里呢。