LINUX.ORG.RU

Как передать в arm-none-eabi-gcc файл .s что бы проект успешно скомпилировался?

 , , ,


0

2

Пытаюсь построить проект в SublimeText для микроконтроллера STM32F100x. При построении в логе копиляции появляется ошибка при компилировании файла startup_stm32f10x_md_vl.s (стартапа):

--- assembling startup_stm32f10x_md_vl.s...
arm-none-eabi-as -c -mcpu=cortex-m3 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard  -I "." -DSTM32F100Rx -DVER_MAJOR=0 -DVER_MINOR=1 -DHSE_VALUE=8000000 -Wa,-adhlns=./startup_stm32f10x_md_vl.lst -x assembler-with-cpp -o startup_stm32f10x_md_vl.o startup_stm32f10x_md_vl.s
arm-none-eabi-as: unrecognized option `-STM32F100Rx'
makefile:322: recipe for target 'startup_stm32f10x_md_vl.o' failed
make[1]: *** [startup_stm32f10x_md_vl.o] Error 1
На сколько я понимаю, то это происходит потому что arm-none-eabi-as не понимает флага "-DSTM32F100Rx" (указание для какого микроконтроллера компилируется код). Если вместо arm-none-eabi-as запускать arm-none-eabi-gcc с флагом "-x assembler-with-cpp", то при построении, arm-none-eabi-gcc начинает ругаться, что он нашел кучу ошибок в файле startup_stm32f10x_md_vl.s (вообщем что он не понимает инструкции и комментарии в ассмеблере).

В качестве редактора кода используется SublimeText, в качестве компилятора - arm-none-eabi-, в качестве линтера кода - LLVM Clang, и одноименная утилита make для построения проекта (всё это собранное лежит в архиве ниже, кнопка на скачивание будет в правом верхнем углу после перехода по ссылке).

«Sublime for ARM» (в этом архиве всё «портабельное»)

Достаточно извлечь папку из архива и просто запустить .bat файл «батник для запуска sublime for ARM (с автопрописыванием в переменную PATH).bat».

Вот ссылка на проект: «проект test1»

Далее в меню SublimeText: Project->Open Project->(переходим в папку с проектом text1 и открываем файл «test1.sublime-project». Нажимаем Ctrl+B - и проект начнет сборку. Прошу помощи и не знаю куда копать =(

Но зачем ты передаёшь as ключ -D если он его не поддерживает? (Точнее поддерживает но делает совсем не то, что в gcc)

Но вообще проблема в том, что твой .s файл использует синтаксис, скорее всего, макроассемблера от Keil компилятора. Этот синтаксис отличается от синтаксиса GNU ассемблера.

Поступи как люди из http://www.keil.com/forum/10545/ и тоже возьми сразу правильный стартап файл.

kim-roader ★★ ()
Ответ на: комментарий от kim-roader

Вы помогли мне решить эту проблему. Вместо стартапа от Keil, я положил стартап для GCC, который взял из CMSIS по пути: Device/ARM/ARMCM3/Source/GCC

Спасибо вам.

Тут вот ещё какое дело, теперь вылезли ошибки, которые явились следствием того, что я не прописал кое-что в «Preprocessor Symbols». Я даже пишу это в кавычках, так как я раньше пользовался IDE Keil и там эта строка именно так называлась и была в настройках проекта отдельным полем.

Где (в каком файле?) теперь мне её нужно вводить если я пользуюсь просто текстовым редактором, компилятором вызываемым из него и утилитой make. Нужно записать в «Preprocessor Symbols» следующее: «USE_STDPERIPH_DRIVER». Как это сделать?

r44083 ()
Ответ на: комментарий от r44083

добавить #define USE_STDPERIPH_DRIVER в твой h-файл или добавить -DUSE_STDPERIPH_DRIVER в команду компиляции (makefile)

sigurd ★★★★ ()
Ответ на: комментарий от sigurd

Заработало только если прописать «#define USE_STDPERIPH_DRIVER» в файле stm32f10x.h. Но тут вылезла ещё одна ошибка касаемо ассемблерного файла :( "./startup_ARMCM3.s: Assembler messages: ./startup_ARMCM3.s:155: Error: symbol `.flash_to_ram_loop' is already defined"

В самом же ассемблерном файле написано очень странно (файл как бы и ассемблерный, но там используются команды условной компиляции (и, наверное, gcc их не понимает):

#if 1
/* Here are two copies of loop implemenations. First one favors code size
 * and the second one favors performance. Default uses the first one.
 * Change to "#if 0" to use the second one */
.flash_to_ram_loop:
    cmp     r2, r3
    ittt    lt
    ldrlt   r0, [r1], #4
    strlt   r0, [r2], #4
    blt    .flash_to_ram_loop
#else
    subs    r3, r2
    ble    .flash_to_ram_loop_end
.flash_to_ram_loop:
    subs    r3, #4
    ldr    r0, [r1, r3]
    str    r0, [r2, r3]
    bgt    .flash_to_ram_loop
.flash_to_ram_loop_end:
#endif

GCC не понимает «#if 1», «#else», «#endif» в ассемблер-файле и ругается. Можно конечно просто закомментировать ненужные строки или есть некое более разумное решение?

r44083 ()
Ответ на: комментарий от r44083

Причем эта ошибка выводится во время сборки проекта много раз.

r44083 ()
Ответ на: комментарий от r44083

А вот как я компилирую этот ассемблеровский файл:

--- assembling startup_ARMCM3.s...
arm-none-eabi-gcc -x assembler-with-cpp -c -mcpu=cortex-m3 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard  -I "." -DSTM32F100Rx -DVER_MAJOR=0 -DVER_MINOR=1 -DHSE_VALUE=8000000 -Wa,-adhlns=./startup_ARMCM3.lst -o startup_ARMCM3.o startup_ARMCM3.s

И он выдает ту ошибку

r44083 ()
Ответ на: комментарий от r44083

GCC не понимает «#if 1», «#else», «#endif» в ассемблер-файле и ругается

У тебя какой-то неправильный gcc. Или, скорее всего, ты нам говоришь неправильную строчку компиляции. Я скачал твой стартап:

$ ls startup_ARMCM3.*
startup_ARMCM3.s
$ arm-none-eabi-gcc -x assembler-with-cpp -c -mcpu=cortex-m3 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard  -I "." -DSTM32F100Rx -DVER_MAJOR=0 -DVER_MINOR=1 -DHSE_VALUE=8000000 -Wa,-adhlns=./startup_ARMCM3.lst -o startup_ARMCM3.o startup_ARMCM3.s
$ ls startup_ARMCM3.*
startup_ARMCM3.lst  startup_ARMCM3.o  startup_ARMCM3.s
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (15:4.9.3+svn227297-1) 4.9.3 20150529 (prerelease)
kim-roader ★★ ()
Последнее исправление: kim-roader (всего исправлений: 1)
Ответ на: комментарий от r44083

И что это у тебя за мусор вместо списка объектов?

arm-none-eabi-g++ . ./main.cpp ./stm32f10x_gpio.c ./core_cm3.c ./stm32f10x_rcc.c ./system_stm32f10x.c ./startup_ARMCM3.s . main.cpp stm32f10x_gpio.c core_cm3.c stm32f10x_rcc.c system_stm32f10x.c startup_ARMCM3.s . ./main.o ./stm32f10x_gpio.c ./core_cm3.c ./stm32f10x_rcc.c ./system_stm32f10x.c ./startup_ARMCM3.s . main.o stm32f10x_gpio.c core_cm3.c stm32f10x_rcc.c system_stm32f10x.c startup_ARMCM3.s . ./main.cpp ./stm32f10x_gpio.o ./core_cm3.o ./stm32f10x_rcc.o ./system_stm32f10x.o ./startup_ARMCM3.s . main.cpp stm32f10x_gpio.o core_cm3.o stm32f10x_rcc.o system_stm32f10x.o startup_ARMCM3.s . ./main.o ./stm32f10x_gpio.o ./core_cm3.o ./stm32f10x_rcc.o ./system_stm32f10x.o ./startup_ARMCM3.s . main.o stm32f10x_gpio.o core_cm3.o stm32f10x_rcc.o system_stm32f10x.o startup_ARMCM3.s . ./main.cpp ./stm32f10x_gpio.c ./core_cm3.c ./stm32f10x_rcc.c ./system_stm32f10x.c ./startup_ARMCM3.o . main.cpp stm32f10x_gpio.c core_cm3.c stm32f10x_rcc.c system_stm32f10x.c startup_ARMCM3.o . ./main.o ./stm32f10x_gpio.c ./core_cm3.c ./stm32f10x_rcc.c ./system_stm32f10x.c ./startup_ARMCM3.o . main.o stm32f10x_gpio.c core_cm3.c stm32f10x_rcc.c system_stm32f10x.c startup_ARMCM3.o . ./main.cpp ./stm32f10x_gpio.o ./core_cm3.o ./stm32f10x_rcc.o ./system_stm32f10x.o ./startup_ARMCM3.o . main.cpp stm32f10x_gpio.o core_cm3.o stm32f10x_rcc.o system_stm32f10x.o startup_ARMCM3.o . ./main.o ./stm32f10x_gpio.o ./core_cm3.o ./stm32f10x_rcc.o ./system_stm32f10x.o ./startup_ARMCM3.o . main.o stm32f10x_gpio.o core_cm3.o stm32f10x_rcc.o system_stm32f10x.o startup_ARMCM3.o  ./.  ././main.cpp  ././stm32f10x_gpio.c  ././core_cm3.c  ././stm32f10x_rcc.c  ././system_stm32f10x.c  ././startup_ARMCM3.s  ./.  ./main.cpp  ./stm32f10x_gpio.c  ./core_cm3.c  ./stm32f10x_rcc.c  ./system_stm32f10x.c  ./startup_ARMCM3.s  ./.  ././main.o  ././stm32f10x_gpio.c  ././core_cm3.c  ././stm32f10x_rcc.c  ././system_stm32f10x.c  ././startup_ARMCM3.s  ./.  ./main.o  ./stm32f10x_gpio.c  ./core_cm3.c  ./stm32f10x_rcc.c  ./system_stm32f10x.c  ./startup_ARMCM3.s  ./.  ././main.cpp  ././stm32f10x_gpio.o  ././core_cm3.o  ././stm32f10x_rcc.o  ././system_stm32f10x.o  ././startup_ARMCM3.s  ./.  ./main.cpp  ./stm32f10x_gpio.o  ./core_cm3.o  ./stm32f10x_rcc.o  ./system_stm32f10x.o  ./startup_ARMCM3.s  ./.  ././main.o  ././stm32f10x_gpio.o  ././core_cm3.o  ././stm32f10x_rcc.o  ././system_stm32f10x.o  ././startup_ARMCM3.s  ./.  ./main.o  ./stm32f10x_gpio.o  ./core_cm3.o  ./stm32f10x_rcc.o  ./system_stm32f10x.o  ./startup_ARMCM3.s  ./.  ././main.cpp  ././stm32f10x_gpio.c  ././core_cm3.c  ././stm32f10x_rcc.c  ././system_stm32f10x.c  ././startup_ARMCM3.o  ./.  ./main.cpp  ./stm32f10x_gpio.c  ./core_cm3.c  ./stm32f10x_rcc.c  ./system_stm32f10x.c  ./startup_ARMCM3.o  ./.  ././main.o  ././stm32f10x_gpio.c  ././core_cm3.c  ././stm32f10x_rcc.c  ././system_stm32f10x.c  ././startup_ARMCM3.o  ./.  ./main.o  ./stm32f10x_gpio.c  ./core_cm3.c  ./stm32f10x_rcc.c  ./system_stm32f10x.c  ./startup_ARMCM3.o  ./.  ././main.cpp  ././stm32f10x_gpio.o  ././core_cm3.o  ././stm32f10x_rcc.o  ././system_stm32f10x.o  ././startup_ARMCM3.o  ./.  ./main.cpp  ./stm32f10x_gpio.o  ./core_cm3.o  ./stm32f10x_rcc.o  ./system_stm32f10x.o  ./startup_ARMCM3.o  ./.  ././main.o  ././stm32f10x_gpio.o  ././core_cm3.o  ././stm32f10x_rcc.o  ././system_stm32f10x.o  ././startup_ARMCM3.o  ./.  ./main.o  ./stm32f10x_gpio.o  ./core_cm3.o  ./stm32f10x_rcc.o  ./system_stm32f10x.o  ./startup_ARMCM3.o -mcpu=cortex-m3 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -nostartfiles -Wl,-Map="./test1.map",--cref -Wl,--gc-sections -TSTM32F100Rx.ld -o "./test1.elf"

Каждый файл передаётся по хрен знает сколько раз причём и в виде исходника и в виде объектника и плюс тонны мусора вроде "./." и ".".

Передавай адекватный список файлов, когда линковать это собираешься.

kim-roader ★★ ()
Ответ на: комментарий от kim-roader

Кое-что исправил, теперь список файлов для линковщика составляют только *.o файлы. Затем возникли ошибки при линковке касаемо файла стартапа (частично решил их тем, что взял скрипт для линковщика из CMSIS в папке ARMCM3). Но всё же осталась одна ошибка:

--- linking...
arm-none-eabi-g++ ././stm32f10x_gpio.o ././core_cm3.o ././stm32f10x_rcc.o ././system_stm32f10x.o ././main.o ././startup_ARMCM3.o -mcpu=cortex-m3 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -nostartfiles -Wl,-Map="./test1.map",--cref -Wl,--gc-sections -TSTM32F100Rx.ld -o "./test1.elf"
././startup_ARMCM3.o: In function `Reset_Handler':
(.text+0x20): undefined reference to `_start'
collect2.exe: error: ld returned 1 exit status
makefile:275: recipe for target 'test1.elf' failed

Вот ссылка на проект на данный момент: https://copy.com/T3jl78uDYC3owuVS

r44083 ()
Ответ на: комментарий от r44083

-nostartfiles

Ты сказал gcc не использовать стандартный _start, но при этом не реализовал свой. И startup.s файл это не то.

kim-roader ★★ ()
Ответ на: комментарий от kim-roader

Как тогда быть? Я попробовал закомментировать -nostartfiles, и тогда получается вот это:

--- linking...
arm-none-eabi-g++ ././stm32f10x_gpio.o ././core_cm3.o ././stm32f10x_rcc.o ././system_stm32f10x.o ././main.o ././startup_ARMCM3.o -mcpu=cortex-m3 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -Wl,-Map="./test1.map",--cref -Wl,--gc-sections -TSTM32F100Rx.ld -o "./test1.elf"
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: error: ././stm32f10x_gpio.o uses VFP register arguments, ./test1.elf does not
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file ././stm32f10x_gpio.o
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: error: ././core_cm3.o uses VFP register arguments, ./test1.elf does not
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file ././core_cm3.o
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: error: ././stm32f10x_rcc.o uses VFP register arguments, ./test1.elf does not
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file ././stm32f10x_rcc.o
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: error: ././system_stm32f10x.o uses VFP register arguments, ./test1.elf does not
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file ././system_stm32f10x.o
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: error: ././main.o uses VFP register arguments, ./test1.elf does not
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file ././main.o
collect2.exe: error: ld returned 1 exit status
makefile:275: recipe for target 'test1.elf' failed
r44083 ()
Ответ на: комментарий от kim-roader

Хорошая новость: закомментировал -nostartfiles и -mfloat-abi=hard. Проект сразу скомпилировался:

--- making asm-lst...
arm-none-eabi-objdump -dC ./test1.elf > ./test1.lss
make[1]: Leaving directory 'D:/4 electronics/st_projects/test1'
arm-none-eabi-size -d ./test1.elf
   text	   data	    bss	    dec	    hex	filename
   2412	   1076	     32	   3520	    dc0	./test1.elf
"Errors: none"
[Finished in 1.0s]

Но заливаться в микроконтроллер не хотел (я использую STM32 ST-LINK Utility как отдельную утилиту через GUI пока что). Ругался на начальный адрес «0x00000000». После чего я в скрипте линковщика изменил значение FLASH с 0x00000000 на 0x08000000. Теперь там так:

MEMORY
{
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x40000   /* 256k */
  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x08000   /*  32k */
}

Прошивка успешно залилась, но похоже что она не работает (должны были загореться светодиоды на GPIOC Pin8 и Pin9 - на них ноль). Правильно ли я понимаю, что теперь нужно подключившись дебагером, пройти по инструкциям микроконтроллера? Раньше я делал это в Keil, а чем теперь это можно сделать из текстового редактора?

r44083 ()
Ответ на: комментарий от kim-roader

А регистры периферии GDB или openOCD могут видеть в реальном времени из микроконтроллера? (как я понимаю, что бы видеть регистры, нужно просто прочитать определенную область памяти) И в чем разница между openOCD и GDB?

r44083 ()
Ответ на: комментарий от r44083

1. Могут 2. Это разные дебаггеры. Для тебя важно, разве что, что поддержку st-link (j-tag, etc.) openocd реализует сам, а gdb требует отдельного gdb-сервера (которым умела работать, например, свободная утилитка st-link)

kim-roader ★★ ()
Ответ на: комментарий от kim-roader

openocd также содержит gdbserver. openocd - это интерфейс к отладке внутри процессора, gdb использует этот интерфейс посредством gdbserver'а для организации высокоуровневой отладки.

slapin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.