реклама на сайте
подробности

 
 
> Проект для STM32F100 компилируется и линкуется gcc, но не работает на МК
r44083
сообщение Sep 13 2015, 11:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 13-09-15
Пользователь №: 88 376



Здравствуйте, я использую gcc тулсет (arm-none-eabi- v4.9), текстовый редактор (Sublime Text 3) и утилиту make. Это мой простой тестовый проект с таким набором ПО.
По факту: проект компилируется, линкуется и я получаю готовый .hex файл. Затем заливаю hex файл в микроконтроллер STM32F100RBT6B (при помощи ST-Link на STM32F1DISCOVERY) и программы STM32 ST-LINK Utility.
Микроконтроллер должен вывести лог. 1 на 8-ю и 9-ю ножки порта C, но этого не происходит. Я грешу на makefile (в свою очередь разобрался с ним, добавил комментарии ко всем операциям и флагам) или скрипт для линковщика.
Прошу помощи в определении причины неработоспособности прошивки.

Проект лежит тут (в корне проекта лежат также файлы, получаемые при построении проекта) : ссылка на проект на гитхаб

Ниже привожу лог построения проекта:
CODE
--- building ARM-test0. defines: -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER
make clean
make[1]: Entering directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
--- cleaning...
del /f /q .\*.o
del /f /q .\*.d
del /f /q .\*.lst
del /f /q .\*.lss
del /f /q .\*.map
del /f /q .\*.elf
del /f /q .\*.bin
del /f /q .\*.hex
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
make .\ARM-test0.elf
make[1]: Entering directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
--- compiling stm32f10x_gpio.c...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./stm32f10x_gpio.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -o stm32f10x_gpio.o stm32f10x_gpio.c
--- compiling system_stm32f10x.c...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./system_stm32f10x.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -o system_stm32f10x.o system_stm32f10x.c
--- compiling core_cm3.c...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./core_cm3.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -o core_cm3.o core_cm3.c
--- compiling stm32f10x_rcc.c...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./stm32f10x_rcc.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -o stm32f10x_rcc.o stm32f10x_rcc.c
--- compiling main.cpp...
arm-none-eabi-g++ -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./main.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -std=gnu++0x -funsigned-bitfields -fshort-enums -o main.o main.cpp
--- assembling startup_ARMCM3.s...
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DSTM32F10X_MD_VL -DHSE_VALUE=8000000 -DUSE_STDPERIPH_DRIVER -I "." -Wa,-adhlns=./startup_ARMCM3.lst -MD -O1 -g -gdwarf-2 -ffunction-sections -fdata-sections -Wall -Wextra -Wundef -Wcast-align -Winline -x assembler-with-cpp -o startup_ARMCM3.o startup_ARMCM3.s
--- linking...
arm-none-eabi-g++ ././stm32f10x_gpio.o ././system_stm32f10x.o ././core_cm3.o ././stm32f10x_rcc.o ././main.o ././startup_ARMCM3.o -mcpu=cortex-m3 -mthumb -Wl,-Map=".\ARM-test0.map",--cref -Wl,--gc-sections -TSTM32F10X_MD_VL.ld -o .\ARM-test0.elf
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
make .\ARM-test0.hex
make[1]: Entering directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
--- making hex...
arm-none-eabi-objcopy -O ihex .\ARM-test0.elf .\ARM-test0.hex
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
make .\ARM-test0.lss
make[1]: Entering directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
--- making disassembly...
arm-none-eabi-objdump -dC .\ARM-test0.elf > .\ARM-test0.lss
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-test0'
arm-none-eabi-size -d .\ARM-test0.elf
text data bss dec hex filename
1592 1076 28 2696 a88 .\ARM-test0.elf
"Errors: none"
[Finished in 1.3s]


P.S.: я положил все файлы исходников в корень проекта для того что бы исключить возможное "недобавление" какого-то файла в передачу компилятору или ещё что-то. Как прошивка заработает, то раскидаю по папкам как положено.

Сообщение отредактировал r44083 - Sep 13 2015, 11:13
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
r44083
сообщение Sep 13 2015, 19:23
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 13-09-15
Пользователь №: 88 376



Проект, сделанный в Keil, отлично работает и светодиоды святятся, поэтому я думаю что железо в порядке. Использую плату STM32VLDISCOVERY.

Цитата(AHTOXA @ Sep 13 2015, 19:49) *
При чём туту sublime text вообще? Вам надо настроить сборку проекта при помощи make. А откуда вы вызываете make - дело десятое.
Поэтому советую - возьмите какой-нибудь тестовый проект целиком, запустите его, а уже потом изменяйте под себя.
Например, вот этот.
(Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно).

Боюсь что ваш проект не соберется, так как я же указал что использую Windows. Надо будет переделать команды вызова системных утилит ну и много где ещё. В makefile у вас указан скрипт для линковщика, а в папке проекта его нет.
К тому же флаг "LD_FLAGS += -nostartfiles" предпалогает некий свой стартап файл, а его в папке проекта тоже нет, и по всей видимости он наверное у вас нестандартный, а какой-то свой (я имею ввиду не такой как в CMSIS). CMSIS вы, как я понял, тоже не используете?
А по поводу Sublime Text - так я же выше (в первом посте) написал, что использую make в связке с Sublime Text как текстовым редактором. Очень помогло, если бы я действительно нашел такой проект, который собрался бы и заработал, что бы я его изучил.

Кстати, Антоха, я брал ваш makefile (в заголовке была подпись АНТОХА), для этого теста, и потом изменял его под винду, добавил для себя комментарии sm.gif. Но всё равно никак не заведется прошивка. Я всё таки грешу на makefile. (Начал читать как прикрутить отладчик, что бы посмотреть, что на самом деле делает микроконтроллер)

Сообщение отредактировал r44083 - Sep 13 2015, 19:16
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 13 2015, 19:52
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(r44083 @ Sep 14 2015, 00:23) *
Боюсь что ваш проект не соберется, так как я же указал что использую Windows.

Тот проект собирается и под Windows тоже (с msys). Скрипт линковщика лежит рядом, в первом проекте. Стартап - тоже лежит рядом. Этот стартап не из CMSIS, стартап из CMSIS на момент написания примера не был пригоден для c++ (не вызывал конструкторы).
Кстати, вы убрали "LD_FLAGS += -nostartfiles", поэтому у вас линкуется не ваш CMSIS-овский стартап (startup_ARMCM3.s), а тот, что предлагает компилятор. Так что не ждите вызова SystemInit(). Возможно, эти два стартапа конфликтуют, и от этого ваш проект не работает.

Цитата(r44083 @ Sep 14 2015, 00:23) *
Кстати, Антоха, я брал ваш makefile (в заголовке была подпись АНТОХА), для этого теста, и потом изменял его под винду, добавил для себя комментарии sm.gif.

Я узнал makefile, потому и написал:
Цитата(AHTOXA @ Sep 13 2015, 21:49) *
(Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно).



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
r44083
сообщение Sep 13 2015, 20:28
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 13-09-15
Пользователь №: 88 376



Цитата(AHTOXA @ Sep 13 2015, 22:52) *
Тот проект собирается и под Windows тоже (с msys). Скрипт линковщика лежит рядом, в первом проекте. Стартап - тоже лежит рядом. Этот стартап не из CMSIS, стартап из CMSIS на момент написания примера не был пригоден для c++ (не вызывал конструкторы).
Кстати, вы убрали "LD_FLAGS += -nostartfiles", поэтому у вас линкуется не ваш CMSIS-овский стартап (startup_ARMCM3.s), а тот, что предлагает компилятор. Так что не ждите вызова SystemInit(). Возможно, эти два стартапа конфликтуют, и от этого ваш проект не работает.


Я узнал makefile, потому и написал:

Я вас понял, это я наоборот понял значение флага nostartfiles
Ещё хотел спросить: вот я добавил флаг -nostartfiles и передал линковщику стартап файл от CMSIS (для GCC), и при построении проекта в лог выпала ошибка:
Код
--- linking...
arm-none-eabi-g++ ././stm32f10x_gpio.o ././system_stm32f10x.o ././core_cm3.o ././stm32f10x_rcc.o ././main.o ././startup_ARMCM3.o -mcpu=cortex-m3 -mthumb -Wl,-Map=".\ARM-test0.map",--cref -Wl,--gc-sections -TSTM32F10X_MD_VL.ld -nostartfiles -o .\ARM-test0.elf
././startup_ARMCM3.o: In function `Reset_Handler':
D:\4 electronics\soft\Sublime Text projects\ARM-test0/startup_ARMCM3.s:168: undefined reference to `_start'
collect2.exe: error: ld returned 1 exit status

Подобные ошибки (только они касались "__data_start__", "__data_end__", "__end__", "__exidx_start") ранее выпадали в лог построения проекта, до того момента, как я не заменил ваш скрипт для линковщика на тот, что предлагает CMSIS.
Теперь осталась только вышеприведенная ошибка. Похоже на то, что она вызвана тем, что в скрипте (от CMSIS) для линковщика, нигде не фигурирует "_start" на которую ругается GCC при построении проекта. Как можно устранить причину такой ошибки?

Сообщение отредактировал r44083 - Sep 13 2015, 20:29
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 14 2015, 04:44
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Попробуйте заменить в startup_ARMCM3.s _start на main.
Откуда вы взяли этот файл? Он очень кривой. Вектора прерываний не те, bss не обнуляется, конструкторы глобальных объектов не вызываются.
Возьмите файл от ST, из StdPeriph_Libj. Причём берите парой - стартап и скрипт линкера.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016