Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: getfsl, не понимаю как собрать
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
xil-user
Добрый день. Достался мне унаследованный проект SoC на Xilinx. Весь софт построен на инструкциях getfsl и putfsl, и я никак не могу понять как его собрать.

В С-шном коде это выглядит так:
do {
getfslx(uart_busy, 9, 0);
} while(uart_busy & UART_BUSY);

функция getfslx - это макрос, определенный как
#define getfslx(val, id, unused) asm volatile ( "getfsl\t%0,"#id : "=d" (val) )

т.е. в итоге порождается ассемблерная инструкция:
getfsl $2,6

Проблема в том, что ни один ассемблер не знает инструкции getfsl. Предыдущие люди собирали с помощью gcc, но Makefile не оставили. Я уже попробовал и gcc и тот gcc, что в EDK у Xilinx, но ни один ассемблер такой инструкции не знает. Подскажите, как собрать?
Alex77
Цитата(xil-user @ Jun 19 2014, 08:11) *
Добрый день. Достался мне унаследованный проект SoC на Xilinx. Весь софт построен на инструкциях getfsl и putfsl, и я никак не могу понять как его собрать.

В С-шном коде это выглядит так:
do {
getfslx(uart_busy, 9, 0);
} while(uart_busy & UART_BUSY);

функция getfslx - это макрос, определенный как
#define getfslx(val, id, unused) asm volatile ( "getfsl\t%0,"#id : "=d" (val) )

т.е. в итоге порождается ассемблерная инструкция:
getfsl $2,6

Проблема в том, что ни один ассемблер не знает инструкции getfsl. Предыдущие люди собирали с помощью gcc, но Makefile не оставили. Я уже попробовал и gcc и тот gcc, что в EDK у Xilinx, но ни один ассемблер такой инструкции не знает. Подскажите, как собрать?

"gcc, что в EDK у Xilinx " - обязан понимать. Это "родная" команда для MicroBlaze. и только родной компилятор/ассемблер понимает сеи команды. Возможно требуется указывать нужные опции при компиляции. Попробуйте собрать сей проект в родной среде EDK/XPS+ECLIPS (а не вручную).
xil-user
Попробовал, сделал из проекта Makefile, там ничего необычного не было, просто вызов gcc:

/opt/Xilinx/14.7/ISE_DS/EDK/gnu/microblaze/lin/bin/mb-gcc -O2 -Wall -c -s -g -fno-pic main.c -o main.o
main.c: In function 'main':
main.c:15:51: warning: variable 'size' set but not used [-Wunused-but-set-variable]
main.c:15:37: warning: variable 'i' set but not used [-Wunused-but-set-variable]
/tmp/ccxdY0Ch.s: Assembler messages:
/tmp/ccxdY0Ch.s:34: Error: unknown opcode "getfsl"
make: *** [s_proc] Error 1

Никак не могу понять, чего же не так. Вроде и компилятор "родной".
Alex77
Цитата(xil-user @ Jun 19 2014, 13:25) *
Попробовал, сделал из проекта Makefile, там ничего необычного не было, просто вызов gcc:

/opt/Xilinx/14.7/ISE_DS/EDK/gnu/microblaze/lin/bin/mb-gcc -O2 -Wall -c -s -g -fno-pic main.c -o main.o
Никак не могу понять, чего же не так. Вроде и компилятор "родной".

Кто "придумал" опции:
-O2 -Wall -c -s -g -fno-pic
???
Если это ВЫ сами придумали это одно, а если eclips - это другое.

Где опция -mcpu ???
xil-user
Цитата(Alex77 @ Jun 19 2014, 13:35) *
Кто "придумал" опции:
-O2 -Wall -c -s -g -fno-pic
???
Если это ВЫ сами придумали это одно, а если eclips - это другое.


eclipse sm.gif Правда почему это так получилось, не знаю.

Убрал все лишние опции, результат тот же:
/share4s/cads/Xilinx/14.7/ISE_DS/EDK/gnu/microblaze/lin/bin/mb-gcc -c -mcpu=v8.50.b main.c -o main.o
/tmp/ccqynTjM.s: Assembler messages:
/tmp/ccqynTjM.s:33: Error: unknown opcode "getfsl"
make: *** [s_proc] Error 1

Сам компилятор про себя говорит:
[serg@microblaze]$ mb-gcc -v
Using built-in specs.
COLLECT_GCC=mb-gcc
COLLECT_LTO_WRAPPER=/share4s/cads/Xilinx/14.7/ISE_DS/EDK/gnu/microblaze/lin/bin/../libexec/gcc/microblaze-xilinx-elf/4.6.4/lto-wrapper
Target: microblaze-xilinx-elf
Configured with: /wrk/ptx/users/nagaraju/GCC_2013_03/gcc/configure --with-gmp=/proj/epdsw/gnu/mb_gnu/libs --with-mpfr=/proj/epdsw/gnu/mb_gnu/libs --with-mpc=/proj/epdsw/gnu/mb_gnu/libs --with-ppl=no --with-cloog=no --target=microblaze-xilinx-elf --prefix=/gnu/mb_gnu/gnu/microblaze/lin --program-prefix=mb- --disable-nls CFLAGS_FOR_TARGET=-O2 CFLAGS_FOR_BUILD=-O2 --with-newlib --disable-lto --enable-languages=c,c++ --enable-multilib --disable-libquadmath --with-sysroot=/gnu/mb_gnu/gnu/microblaze/lin/microblaze-xilinx-elf
Thread model: single
gcc version 4.6.4 20120924 (Xilinx 14.1 Build EDK_P.13 28 Sep 2013) (GCC)
Alex77
Цитата(xil-user @ Jun 19 2014, 14:01) *
eclipse sm.gif Правда почему это так получилось, не знаю.

Убрал все лишние опции, результат тот же:
/share4s/cads/Xilinx/14.7/ISE_DS/EDK/gnu/microblaze/lin/bin/mb-gcc -c -mcpu=v8.50.b main.c -o main.o
/tmp/ccqynTjM.s: Assembler messages:
/tmp/ccqynTjM.s:33: Error: unknown opcode "getfsl"
make: *** [s_proc] Error 1

Сам компилятор про себя говорит:
[serg@microblaze]$ mb-gcc -v
Using built-in specs.
COLLECT_GCC=mb-gcc
COLLECT_LTO_WRAPPER=/share4s/cads/Xilinx/14.7/ISE_DS/EDK/gnu/microblaze/lin/bin/../libexec/gcc/microblaze-xilinx-elf/4.6.4/lto-wrapper
Target: microblaze-xilinx-elf
Configured with: /wrk/ptx/users/nagaraju/GCC_2013_03/gcc/configure --with-gmp=/proj/epdsw/gnu/mb_gnu/libs --with-mpfr=/proj/epdsw/gnu/mb_gnu/libs --with-mpc=/proj/epdsw/gnu/mb_gnu/libs --with-ppl=no --with-cloog=no --target=microblaze-xilinx-elf --prefix=/gnu/mb_gnu/gnu/microblaze/lin --program-prefix=mb- --disable-nls CFLAGS_FOR_TARGET=-O2 CFLAGS_FOR_BUILD=-O2 --with-newlib --disable-lto --enable-languages=c,c++ --enable-multilib --disable-libquadmath --with-sysroot=/gnu/mb_gnu/gnu/microblaze/lin/microblaze-xilinx-elf
Thread model: single
gcc version 4.6.4 20120924 (Xilinx 14.1 Build EDK_P.13 28 Sep 2013) (GCC)

Демо пример в студию. (main.c)
Kuzmi4
2 xil-user
На счёт getfsl - такого опкода нет, но есть get - а вот он как раз может получать данные или контрол с FSL линка ( rfsl0, rfsl1, ... rfsl15 ).
Возможно ваши товарищи специально переназвали команду где то - не силён в Makefile.
xil-user
Еще одна попытка:

генерируем из всего набора исходников единый ассемблерный файл:
$ mb-gcc -c -mcpu=v8.50.b main.c -S -o main.S

запускаем штатный ассемблер:
$ mb-as main.S
main.S: Assembler messages:
main.S:33: Error: unknown opcode "getfsl"

$ mb-as -v
GNU assembler version 2.23.2 (microblaze-xilinx-elf) using BFD version (GNU Binutils) 2.23.2.20130707
Alex77
Цитата(xil-user @ Jun 19 2014, 17:57) *
Еще одна попытка:

генерируем из всего набора исходников единый ассемблерный файл:
$ mb-gcc -c -mcpu=v8.50.b main.c -S -o main.S

запускаем штатный ассемблер:
$ mb-as main.S
main.S: Assembler messages:
main.S:33: Error: unknown opcode "getfsl"

$ mb-as -v
GNU assembler version 2.23.2 (microblaze-xilinx-elf) using BFD version (GNU Binutils) 2.23.2.20130707


Дано:
ISE 12.4
gcc version 4.1.2 20070214 (Xilinx 12.3 Build EDK_MS3.66 15 Jul 2010)
GNU assembler version 2.16 (microblaze-xilinx-elf) using BFD version 2.16
Демо пример если прямо указать асм-команду:

asm volatile(" neaget r2, rfsl0" );

Компилится.



Проблема в использовании макросов из файла "fsl.h"
#define getfslx(val, id, flags) asm volatile (stringify(flags) "get\t%0,rfsl" stringify(id) : "=d" (val))

толи компилятор глючный -толи макрос кривой толи ещё что... разбираться лень.
xil-user
Да, действительно, если заменить определение getfsl и putfsl на:
#define putfsl(val, id) asm volatile ("put\t%0,rfsl" stringify(id) :: "d" (val))
#define getfsl(val, id) asm volatile ("get\t%0,rfsl" stringify(id) : "=d" (val))

то компилируется. Как же оно собиралось раньше я так и не понял... Но это уже что-то.

Спасибо, парни.
Alex77
Цитата(xil-user @ Jun 20 2014, 18:29) *
Да, действительно, если заменить определение getfsl и putfsl на:
#define putfsl(val, id) asm volatile ("put\t%0,rfsl" stringify(id) :: "d" (val))
#define getfsl(val, id) asm volatile ("get\t%0,rfsl" stringify(id) : "=d" (val))

то компилируется. Как же оно собиралось раньше я так и не понял... Но это уже что-то.

Спасибо, парни.

Есть пару моментов: Есть ещё понятие ФЛАГИ (типа "атомарность исполнения") задаются грубо говоря буквами перед put и get. Читайте описание этих команд в документации на процессор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.