0

好的,这可能是一个非常笼统的问题,但我不熟悉这个话题并且很高兴得到任何提示。

我有一个来自 SoucereyCodeBench for ARM 的交叉编译工具链(arm-xilinx-linux-gnueabi-)。我交叉编译了一个使用编译器选项的库:-DSC_INCLUDE_FX -DSC_USE_PTHREADS -pthreads -fPIC -DPIC

因此,如果我想将库用于裸机程序,我猜我需要 pthreads 用于裸机编译器(arm-xilinx-eabi-)?

否则我的程序可能一开始就不会运行或编译。那么可以为裸机编译 pthread 吗?

4

2 回答 2

5

线程和裸机

裸机编程目标仅提供您在其上放置的内容。大多数人熟悉的 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-. 我上面所说的关于裸机和线程的所有内容都将适用。

于 2013-06-14T18:42:21.957 回答
4

我认为这将是移植您的代码而不是简单地交叉编译它不变的问题。顾名思义,POSIX 线程(pthreads) 采用 POSIX API。

如果您需要裸机ARM 目标上的线程,您至少需要某种线程调度库,其中有很多. 大多数 RTOS 不是 Linux 意义上的完整操作系统,而是具有 IPC 机制的简单调度程序,它们像其他任何静态库一样链接到您的单片应用程序 - 在系统直接引导到的意义上,这可能仍然算作“裸机”您main()负责创建任务/线程和启动调度程序的函数。

一些 RTOS 支持 POSIX API,因此支持 pthread,但这些往往是更大更完整的操作系统,而不是简单的调度程序 - 无论哪种方式,它们通常比 Linux 更小且更具可扩展性,因此仍然可以满足您的“裸机”要求。

当然,没有什么能阻止您围绕任何 RTOS 库创建一个包装器,以提供一个 pthread 兼容的 API,这可能会使您的代码移植更简单。

于 2013-06-14T08:45:58.573 回答