2015-07-23 1 views
0

Я клонировал и построил репозиторий riscv-tools на моей машине ubuntu. Привет, мировая программа работает хорошо.Поддерживает ли RISCV инструментальную цепочку библиотеку pthread?

Теперь я пытаюсь перенести приложение из цели X86 в цель riscv (RV32IM). Мое приложение зависит от библиотек math и 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; 
} 

Ok и вот моя командная строка для компиляции для целевой 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 

В чем проблема с PTHREAD библиотеки в цепочке инструментов RISCV? Может ли кто-нибудь из сообщества RISCV воспроизвести его? Кто-нибудь испытывает ту же проблему?

Любая помощь приветствуется!

ответ

1

Для многопоточных приложений вам необходимо перейти на компилятор и ядро ​​Linux. Ядро proxy (pk) не поддерживает многопоточность в пользовательских программах, которые он запускает. Кроме того, мы не создали компилятор, основанный на newlib, для поддержки pthreads.

шаги

  1. Построить riscv-linux компилятор
  2. Построить riscv-linux
  3. Перекомпилируйте приложение с новым компилятором (возможно, с помощью -static)
  4. Построить образ диска для Linux
  5. Включите ваше приложение на образ диска
  6. Дайте нам знать, как это происходит
0

Спасибо за ответ.

FYI здесь по электронной почте ответ я получил от Эндрю Waterman (RISCV проект инсайдерской!):

«Короткий ответ, что нет поддержки потоковой для встроенного Newlib/ELF набора инструментов, и нет никаких планов, чтобы добавить Это.GNU/Linux toolchain имеет рабочие pthreads, но, разумеется, для исполняемых файлов требуется Linux. »

В краткосрочной перспективе я не буду пытаться скомпилировать образ Linux и образ Linux, потому что я нашел способ работать мой код приложения и избавиться от зависимостей библиотеки pthread.

Однако очень вероятно, что в ближайшем будущем я попытаюсь создать инструментальную цепочку linux и выполнить описанные выше шаги для оценки многопоточного приложения. определенно дайте вам знать, как это происходит.