Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проект для STM32F100 компилируется и линкуется gcc, но не работает на МК
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
r44083
Здравствуйте, я использую 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
Кстати, забыл сказать, что использую ОС Windows.
Саму "среду разработки" на основе Sublime Text 3 вы можете скачать тут (она полностью портабельная): Sublime Text для ARM 2015.09.12 win32 (portable) (кнопка на скачивание в правом верхнем углу страницы)
Что бы открыть проект, нужно распаковать папку по ссылке выше и запустить Sublime Text с помощью bat файла в той же папке.
Затем в верхнем меню саблайма: Project -> Open Project -> в папке тестового проекта ARM-test0 (ссылка на гитхаб выше) выбрать и открыть файл ARM-test0.sublime-project
Что бы построить проект нужно нажать Ctrl+B.
AHTOXA
При чём туту sublime text вообще? Вам надо настроить сборку проекта при помощи make. А откуда вы вызываете make - дело десятое.
Поэтому советую - возьмите какой-нибудь тестовый проект целиком, запустите его, а уже потом изменяйте под себя.
Например, вот этот.
(Ваш makefile, похоже, базируется на makefile из этого проекта, так что должно быть несложно).
adnega
Цитата(r44083 @ Sep 13 2015, 14:10) *
Затем заливаю hex файл в микроконтроллер STM32F100RBT6B

С железом порядок? Кварц на 8МГц, ножки BOOT со своими уровнями? Есть генерация кварца?
Может, схему покажете?
r44083
Проект, сделанный в 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. (Начал читать как прикрутить отладчик, что бы посмотреть, что на самом деле делает микроконтроллер)
AHTOXA
Цитата(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 из этого проекта, так что должно быть несложно).

r44083
Цитата(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 при построении проекта. Как можно устранить причину такой ошибки?
AHTOXA
Попробуйте заменить в startup_ARMCM3.s _start на main.
Откуда вы взяли этот файл? Он очень кривой. Вектора прерываний не те, bss не обнуляется, конструкторы глобальных объектов не вызываются.
Возьмите файл от ST, из StdPeriph_Libj. Причём берите парой - стартап и скрипт линкера.
r44083
Цитата(AHTOXA @ Sep 14 2015, 07:44) *
Попробуйте заменить в startup_ARMCM3.s _start на main.
Откуда вы взяли этот файл? Он очень кривой. Вектора прерываний не те, bss не обнуляется, конструкторы глобальных объектов не вызываются.
Возьмите файл от ST, из StdPeriph_Libj. Причём берите парой - стартап и скрипт линкера.

Представляете, заменил как вы сказали в startup_ARMCM3.s _start на main и заработало. В итоге заменил и стартап и скрипт для линковки на те, что шли в StdPeriphLib 3.5.
Вписал данные о памяти в скрипт для линковщика, и прошивка тоже заработала. Только остался непонятным вопрос о переменной "_estack" в скрипте для линковщика.
Как она считается, просто начальный адрес ОЗУ + длина ОЗУ? Ещё видел такие варианты: _estack = ORIGIN(RAM) + LENGTH(RAM) - 8. И такие: _estack = ORIGIN(RAM) + LENGTH(RAM) - 4.
Правильно ли я вписал _estack тут для STM32F100RBT6B:
Код
/* Memory Spaces Definitions */

MEMORY
{
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
}

/* higher address of the user mode stack */
_estack = 0x20001F40;

Кстати почему в некоторых проектах переменная "_Minimum_Stack_Size = 0x100 ;", а в других (для другого мк) она уже равна: "_Minimum_Stack_Size = 0x144 ;" Из какой документации можно узнать "_Minimum_Stack_Size"?
И что за переменная такая "_estack"? Судя по комментариям в коде это максимальный адрес пользовательского стека, то есть тут идет речь, что максимальный адрес стека не может быть больше чем конец ОЗУ?
Также интересно, что ARM уже выпустила CMSIS версии 3.01, а в StdPeriphLib 3.5 используется CMSIS версии 1.3. Можно ли и нужно ли использовать белее свежую версию? Как поступаете вы?
AHTOXA
Ну и славно.
_estack - это начальное значение для указателя стека, его вершина. Это значение засовывается на первую позицию таблицы векторов. Поскольку стек растёт вниз, то обычно _estack указывает на конец ОЗУ. А поскольку AAPCS (ARM Architecture Procedure Call Standard) требует, чтобы стек был выровнен на 8 байт, правильным инициализирующим значением в этом случае будет
ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8).
Что касаемо _Minimum_Stack_Size - это минимальное место в ОЗУ под стек. Если останется меньше (займёте место переменными и кучей), то линкер заругается.
r44083
И последний вопрос: нужно ли делать "Full chip erase" перед тем, как прошить STM?
AHTOXA
Если прошивается без этого, то не надо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.