|
|
  |
getfsl, не понимаю как собрать |
|
|
|
Jun 19 2014, 04:11
|
Группа: Новичок
Сообщений: 5
Регистрация: 18-06-14
Пользователь №: 81 988

|
Добрый день. Достался мне унаследованный проект 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, но ни один ассемблер такой инструкции не знает. Подскажите, как собрать?
|
|
|
|
|
Jun 19 2014, 04:56
|
Местный
  
Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695

|
Цитата(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 (а не вручную).
|
|
|
|
|
Jun 19 2014, 09:25
|
Группа: Новичок
Сообщений: 5
Регистрация: 18-06-14
Пользователь №: 81 988

|
Попробовал, сделал из проекта 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
Никак не могу понять, чего же не так. Вроде и компилятор "родной".
|
|
|
|
|
Jun 19 2014, 09:35
|
Местный
  
Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695

|
Цитата(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 ???
|
|
|
|
|
Jun 19 2014, 10:01
|
Группа: Новичок
Сообщений: 5
Регистрация: 18-06-14
Пользователь №: 81 988

|
Цитата(Alex77 @ Jun 19 2014, 13:35)  Кто "придумал" опции: -O2 -Wall -c -s -g -fno-pic ??? Если это ВЫ сами придумали это одно, а если eclips - это другое. eclipse  Правда почему это так получилось, не знаю. Убрал все лишние опции, результат тот же: /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)
|
|
|
|
|
Jun 19 2014, 10:17
|
Местный
  
Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695

|
Цитата(xil-user @ Jun 19 2014, 14:01)  eclipse  Правда почему это так получилось, не знаю. Убрал все лишние опции, результат тот же: /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)
|
|
|
|
|
Jun 19 2014, 13:57
|
Группа: Новичок
Сообщений: 5
Регистрация: 18-06-14
Пользователь №: 81 988

|
Еще одна попытка:
генерируем из всего набора исходников единый ассемблерный файл: $ 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
Сообщение отредактировал xil-user - Jun 19 2014, 13:58
|
|
|
|
|
Jun 20 2014, 05:34
|
Местный
  
Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695

|
Цитата(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)) толи компилятор глючный -толи макрос кривой толи ещё что... разбираться лень.
|
|
|
|
|
Jun 20 2014, 14:29
|
Группа: Новичок
Сообщений: 5
Регистрация: 18-06-14
Пользователь №: 81 988

|
Да, действительно, если заменить определение 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))
то компилируется. Как же оно собиралось раньше я так и не понял... Но это уже что-то.
Спасибо, парни.
|
|
|
|
|
Jun 20 2014, 16:28
|
Местный
  
Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695

|
Цитата(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. Читайте описание этих команд в документации на процессор.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|