好吧,这可能是一个非常普遍的问题,但我不是很熟悉这个主题,很高兴得到任何提示。
我有一个交叉编译工具链从sourcereycodebench为ARM (ARM -xilinx-linux-gnueabi-)。我交叉编译了一个使用编译器选项的库:-DSC_INCLUDE_FX -DSC_USE_PTHREADS -pthreads -fPIC -DPIC
所以,如果我想使用裸机程序库,我将需要pthreads裸机编译器(arm-xilinx-eabi-),我猜?
否则我的程序可能无法运行或编译。那么可以为裸机编译pthread吗?
Threads and Bare Metal
裸机编程目标只提供您放在它们上面的内容。大多数人熟悉的pthread实现是Linux NPTL版本,它能够工作是因为Linux内核和GNU C库使它能够工作。在裸机目标上,您无法获得Linux内核或GNU C库的好处。你将不得不带上你自己的裸机线程库和运行时,但在这种情况下,你可能最好使用提供线程的RTOS。
关于工具链前缀的说明
gcc工具链前缀arm-xilinx-linux-gnueabi-
表示目标是ARM Linux,而不是裸机。arm-xilinx-linux-gnueabi-
工具链将构建感知pthread的代码(-lpthread
),但它将假设Linux目标已经安装了pthread库和其他必要的软件层。
如果您切换到gcc ARM xilinx工具链的裸机版本,那么您的工具链前缀将是arm-xilinx-eabi-
。
我认为这将是一个移植代码的问题,而不是简单地不加修改地交叉编译。顾名思义,POSIX线程 (pthreads)假定POSIX API。
如果您需要在裸机 ARM目标上运行线程,那么您至少需要某种线程调度库,这种库有很多。大多数rtos不是Linux意义上的完整操作系统,而是带有IPC机制的简单调度器,它像其他任何静态库一样链接到您的单片应用程序-这可能仍然算作"裸机",因为系统直接引导到您的main()
函数,其中您负责创建任务/线程并启动调度器。
一些rtos支持POSIX api,因此支持pthread,但这些往往是更大更完整的操作系统,而不是简单的调度程序-无论哪种方式,它们通常比Linux更小,更可扩展,因此可能满足您的"裸机"需求。
当然,没有什么能阻止你在任何RTOS库周围创建一个包装器,以提供一个pthread兼容的API,这可能会使移植你的代码更简单。