我已经克隆并在我的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社区的任何人都可以重现它吗? 有没有遇到同样问题的人?
感谢任何帮助!
答案 0 :(得分:1)
对于多线程应用程序,您需要升级到Linux编译器和内核。代理内核(pk)不支持其运行的用户程序中的多线程。此外,我们还没有设置基于newlib的编译器来支持pthreads。
步骤
答案 1 :(得分:1)
感谢您的回答。
这里是我从Andrew Waterman(RISCV项目内幕人员)获得的电子邮件答案:
&#34;简短的回答是,对嵌入式Newlib / ELF工具链没有pthread支持,并且没有计划添加它。 GNU / Linux工具链具有可用的pthread,但当然它生成的二进制文件需要Linux运行。&#34;
在短期内,我不会继续编译Linux工具链和Linux映像,因为我找到了一种方法来解决我的应用程序代码并摆脱pthread库依赖。
但是,很有可能在不久的将来,我将尝试构建linux工具链并按照上述步骤来评估多线程应用程序。我一定会让你知道它是怎么回事。