3

我已经在我的 ubuntu 机器上克隆并构建了 riscv-tools 存储库。你好世界程序运行良好。

现在,我正在尝试将应用程序从 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社区的任何人都可以复制它吗?有人遇到同样的问题吗?

任何帮助表示赞赏!

4

2 回答 2

3

对于多线程应用程序,您需要升级到 linux 编译器和内核。代理内核 (pk) 在其运行的用户程序中不支持多线程。此外,我们还没有设置基于 newlib 的编译器来支持 pthread。

脚步

  1. 构建riscv-linux编译器
  2. 构建riscv-linux
  3. 使用新编译器重新编译您的应用程序(可能使用 -static)
  4. 为 linux 构建磁盘映像
  5. 在磁盘映像中包含您的应用程序
  6. 让我们知道怎么回事
于 2015-07-24T20:35:22.357 回答
2

感谢你的回答。

仅供参考,这是我从 Andrew Waterman(RISCV 项目内部人员!)那里得到的电子邮件答复:

“简短的回答是嵌入式 Newlib/ELF 工具链不支持 pthread,也没有添加它的计划。GNU/Linux 工具链有工作的 pthread,但它生成的二进制文件当然需要 Linux 才能运行。”

短期内我不会追求编译 Linux 工具链和 Linux 映像,因为我找到了一种方法来解决我的应用程序代码并摆脱 pthread 库依赖。

但是,很有可能在不久的将来我会尝试构建 linux 工具链并按照上述步骤评估多线程应用程序。我一定会让你知道情况如何。

于 2015-07-30T10:52:26.890 回答