RISCV 工具链是否支持 pthread 库?
Does RISCV tool chain support pthread library?
我已经在我的 ubuntu 机器上克隆并构建了 riscv-tools 存储库。 Hello world 程序运行良好。
现在,我正在尝试将应用程序从 X86 目标移植到 riscv (RV32IM) 目标。我的应用程序依赖于数学和 pthread 库。我在我的代码中尝试使用 pthread.h 头文件中的声明时遇到问题。
我做了一个非常简单的示例代码来演示我的问题。
这是我的example.c文件内容
#include <stdio.h>
#include <math.h>
#include <pthread.h>
int main(void)
{
float my_float;
int rc;
pthread_t my_thread;
pthread_mutex_t my_lock;
printf("Example start!\n");
my_float = sqrt( 16.0 );
printf("sqrt(16.0) = %f\n", my_float);
rc = pthread_mutex_init(&my_lock, NULL);
printf("return code from pthread_mutex_init() is %d\n", rc);
printf("Example End!\n");
return 0;
}
好的,这是我为 RISCV 目标编译它的命令行
riscv64-unknown-elf-gcc -Wall -m32 -march=RV32IM -o example example.c -lm -lpthread
编译器输出如下:
example.c: In function 'main':
example.c:10:3: error: unknown type name 'pthread_t'
pthread_t my_thread;
^
example.c:11:3: error: unknown type name 'pthread_mutex_t'
pthread_mutex_t my_lock;
^
example.c:19:3: warning: implicit declaration of function 'pthread_mutex_init' [-Wimplicit-function-declaration]
rc = pthread_mutex_init(&my_lock, NULL);
^
example.c:10:13: warning: unused variable 'my_thread' [-Wunused-variable]
pthread_t my_thread;
^
请注意,数学库没有问题,但 pthread 库会产生错误。
显然,为 X86 目标编译这个简单的示例非常有效。 X86 目标的程序输出是:
> ./example
Example start!
sqrt(16.0) = 4.000000
return code from pthread_mutex_init() is 0
Example End!
这是我们在执行此操作时在 RISCV 目标上编译和运行时最终应该得到的:
spike pk ./example
RISCV 工具链中的 pthread 库有什么问题?
RISCV 社区的任何人都可以重现它吗?
有人遇到同样的问题吗?
感谢任何帮助!
对于多线程应用程序,您将需要升级到 linux 编译器和内核。代理内核 (pk) 在其运行的用户程序中不支持多线程。此外,我们还没有设置基于 newlib 的编译器来支持 pthreads。
步骤
- 构建 riscv-linux 编译器
- 建造riscv-linux
- 使用新编译器重新编译您的应用程序(可能使用 -static)
- 为 linux
构建磁盘映像
- 将您的应用程序包含在磁盘映像中
- 告诉我们进展如何
感谢您的回答。
仅供参考,这是我从 Andrew Waterman(RISCV 项目内幕人士!)那里收到的一封电子邮件答复:
"Short answer is that there's no pthread support for the embedded Newlib/ELF toolchain, and there are no plans to add it. The GNU/Linux toolchain has working pthreads, but of course the binaries it produces require Linux to run."
短期内我不会继续编译 Linux 工具链和 Linux 图像,因为我找到了解决我的应用程序代码并摆脱 pthread 库依赖的方法。
不过,我很有可能在不久的将来尝试构建 linux 工具链并按照上述步骤评估多线程应用程序。我一定会让你知道进展如何。
我已经在我的 ubuntu 机器上克隆并构建了 riscv-tools 存储库。 Hello world 程序运行良好。
现在,我正在尝试将应用程序从 X86 目标移植到 riscv (RV32IM) 目标。我的应用程序依赖于数学和 pthread 库。我在我的代码中尝试使用 pthread.h 头文件中的声明时遇到问题。
我做了一个非常简单的示例代码来演示我的问题。
这是我的example.c文件内容
#include <stdio.h>
#include <math.h>
#include <pthread.h>
int main(void)
{
float my_float;
int rc;
pthread_t my_thread;
pthread_mutex_t my_lock;
printf("Example start!\n");
my_float = sqrt( 16.0 );
printf("sqrt(16.0) = %f\n", my_float);
rc = pthread_mutex_init(&my_lock, NULL);
printf("return code from pthread_mutex_init() is %d\n", rc);
printf("Example End!\n");
return 0;
}
好的,这是我为 RISCV 目标编译它的命令行
riscv64-unknown-elf-gcc -Wall -m32 -march=RV32IM -o example example.c -lm -lpthread
编译器输出如下:
example.c: In function 'main':
example.c:10:3: error: unknown type name 'pthread_t'
pthread_t my_thread;
^
example.c:11:3: error: unknown type name 'pthread_mutex_t'
pthread_mutex_t my_lock;
^
example.c:19:3: warning: implicit declaration of function 'pthread_mutex_init' [-Wimplicit-function-declaration]
rc = pthread_mutex_init(&my_lock, NULL);
^
example.c:10:13: warning: unused variable 'my_thread' [-Wunused-variable]
pthread_t my_thread;
^
请注意,数学库没有问题,但 pthread 库会产生错误。
显然,为 X86 目标编译这个简单的示例非常有效。 X86 目标的程序输出是:
> ./example
Example start!
sqrt(16.0) = 4.000000
return code from pthread_mutex_init() is 0
Example End!
这是我们在执行此操作时在 RISCV 目标上编译和运行时最终应该得到的:
spike pk ./example
RISCV 工具链中的 pthread 库有什么问题? RISCV 社区的任何人都可以重现它吗? 有人遇到同样的问题吗?
感谢任何帮助!
对于多线程应用程序,您将需要升级到 linux 编译器和内核。代理内核 (pk) 在其运行的用户程序中不支持多线程。此外,我们还没有设置基于 newlib 的编译器来支持 pthreads。
步骤
- 构建 riscv-linux 编译器
- 建造riscv-linux
- 使用新编译器重新编译您的应用程序(可能使用 -static)
- 为 linux 构建磁盘映像
- 将您的应用程序包含在磁盘映像中
- 告诉我们进展如何
感谢您的回答。
仅供参考,这是我从 Andrew Waterman(RISCV 项目内幕人士!)那里收到的一封电子邮件答复:
"Short answer is that there's no pthread support for the embedded Newlib/ELF toolchain, and there are no plans to add it. The GNU/Linux toolchain has working pthreads, but of course the binaries it produces require Linux to run."
短期内我不会继续编译 Linux 工具链和 Linux 图像,因为我找到了解决我的应用程序代码并摆脱 pthread 库依赖的方法。
不过,我很有可能在不久的将来尝试构建 linux 工具链并按照上述步骤评估多线程应用程序。我一定会让你知道进展如何。