Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Eclipse + GCC для ARM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Страницы: 1, 2, 3, 4, 5, 6
AHTOXA
gcc-arm-embedded
Упс, опоздал маленькоsm.gif
swisst
Спасибо. Ссылки - то, что надо.
swisst
прошу помощи

при сборке цели all make завершается с ошибкой (точнее):
Код
d:/projects/tools/gnutoolsforarmembedded/4.9.2014q4/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol _start; defaulting to 00008000
output/startup_ARMCM0.o: In function `Reset_Handler':
D:\Projects\Prog\EclipseWS\Test/startup_ARMCM0.c:294: undefined reference to `__data_start__'
D:\Projects\Prog\EclipseWS\Test/startup_ARMCM0.c:294: undefined reference to `__data_end__'
output/startup_ARMCM0.o:(.vectors+0x0): undefined reference to `__StackTop'
collect2.exe: error: ld returned 1 exit status
make: *** [output/MIG2.elf] Error 1


из того что мне понятно: все вышеупомянутые undefined reference вычисляются в скрипте линкера и должны попасть в файл startup
почему этого не происходит - понять не могу...потому и прошу
AHTOXA
Цитата(swisst @ Jan 10 2015, 23:58) *
из того что мне понятно: все вышеупомянутые undefined reference вычисляются в скрипте линкера и должны попасть в файл startup

А вы в makefile указали линкеру, какой скрипт использовать (что-то типа -T$(LD_SCRIPT)) ?
swisst
Цитата(AHTOXA @ Jan 10 2015, 21:32) *
А вы в makefile указали линкеру, какой скрипт использовать (что-то типа -T$(LD_SCRIPT)) ?


обязательно. проект я прикрепил на всякий случай.

стоит оговориться: ARM plugin не использую. пытаюсь собрать тестовый проект в eclipse c настройками, как в Вашем сообщении
AHTOXA
Поскольку у вас в проекте нет ни одного cpp- файла, то линковка идёт по первой ветке:
Код
# use $(CC) for C-only projects or $(CPP) for C++-projects:
ifeq "$(strip $(CPPSRC)$(CPPARM))" ""
    @$(CC) $(THUMB) $(CFLAGS) $(DEPFLAGS) $(ALLOBJ) --output $@ -nostartfiles
else
    $(CPP) $(THUMB) $(CFLAGS) $(DEPFLAGS) $(ALLOBJ) --output $@ $(LDFLAGS)
endif

А в этой ветке LDFLAGS не указаны.

ЗЫ. У make есть ключик -n, который заставляет его ничего не выполнять, а лишь печатать команды, которые он будет выполнять. Очень удобно смотреть, как будет идти выполнение makefile.
swisst
Цитата(AHTOXA @ Jan 10 2015, 22:16) *
А в этой ветке LDFLAGS не указаны.

ЗЫ. У make есть ключик -n, который заставляет его ничего не выполнять, а лишь печатать команды, которые он будет выполнять. Очень удобно смотреть, как будет идти выполнение makefile.


искренне благодарю. все собирается.
_Pasha
сегодня окончательно ушел с eclipse Luna, ибо этот глюкодром стал ни на что не пригоден.
перешел в gdb с ком.строкой - исчезли глюки с spi - когда бегаешь по всем углам и не знаешь, кто неправ. а неправа в итоге связка отладчика. smile3046.gif
и как многие говорят: пишите собственные мейкфайлы (занятие не для экспресс-макетов), так и теперь могу сказать - пользуйтесь чистым gdb sm.gif благо, ему через командные файлы очень много можно сказать.
swisst
доброго вечера

может тема вопроса заезженная или вообще не в ту ветку написал...все же...

eclipse + gcc + ARM + LwIP RAW, есть структура файлов:
D:\Tools\LwIP - тут последняя версия, которая тянется из GIT-репозитория
D:\Projects\EclipseWorkSpace\Project_1

хочу, чтобы Project_1 (в котором веб сервер будет на базе LwIP) был минимально связан с папкой LwIP

т.е. хочу, чтобы исходники и хедеры в папке LwIP не менялись и не допиливались вообще. чтобы все, что зависит от мк (в том числе и lwipopts.h,
lwippools.h, драйверы PHY и т.д.) хранилось в подпапке проекта.

все подключения делаю через make, голый eclipse через discovery все резолвит - исходники компилируются, eclipse по подключенным папкам прыгает - файлы открывает, все вроде неплохо, но - есть src/lwip/timers.c - таймеры LwIP, которые хотят процедуру sys_now() (возвращает значение мс, которые считает SysTick) - вот как ее туда корректно передать ? так чтобы в исходниках LwIP ничего не менять
AHTOXA
Цитата(swisst @ Dec 13 2015, 23:56) *
есть src/lwip/timers.c - таймеры LwIP, которые хотят процедуру sys_now() (возвращает значение мс, которые считает SysTick) - вот как ее туда корректно передать ? так чтобы в исходниках LwIP ничего не менять

Просто создайте такую функцию в любом файле проекта. Если ваш проект на c++, то обзовите её extern "C", типа так:
Код
extern "C" unsigned long sys_now()
{
}
swisst
Цитата(AHTOXA @ Dec 13 2015, 23:27) *
Просто создайте такую функцию в любом файле проекта. Если ваш проект на c++, то обзовите её extern "C", типа так:


да, к слову. проект на С. в общем спасибо - магия форума сработала
на самом деле так и сделал - в папке_проекта/timer.c - который мой, так сказать, тикает раз в мс - его значение и возвращал в этой функции. почему не собиралось - не могу понять (и это хуже всего).

думал, что-то упускаю...
Harvester
Цитата(AHTOXA @ Oct 9 2014, 07:28) *

При попытке собрать пример из scmRTOS, Eclipse ругается:
Код
11:17:09 **** Incremental Build of configuration Default for project 1-EventFlag ****
all
Cannot run program "": Launching failed

Error: Program "" not found in PATH
PATH=[C:\Program Files (x86)\GNU ARM Eclipse\Build Tools\2.6-201507152002\bin;...;C:\Program Files (x86)\GNU Tools ARM Embedded\5.2 2015q4\bin...]

Как видно, весь необходимый инструментарий установлен, пути прописаны.
Подскажите, пожалуйста, в чем может быть дело?
IgorKossak
Цитата(Harvester @ Feb 24 2016, 10:31) *
Подскажите, пожалуйста, в чем может быть дело?

Путь надо в кавычках указывать. Пробел в Program files мешает. Или переустановить тулчейн в папку без пробелов.
Harvester
Цитата(IgorKossak @ Feb 24 2016, 11:46) *
Путь надо в кавычках указывать. Пробел в Program files мешает. Или переустановить тулчейн в папку без пробелов.

Почему же во всех руководствах жирным шрифтом пишут не менять путь установки по-умолчанию?
Ну да ладно.
Добавил кавычки в глобальных настройках (Preferences/C++/Build/Global Tool Paths) к путям Build tools folder и Toolchain folder. В результате Eclipse формирует путь:
Код
PATH=[C:\Eclipse-Luna\"C:\Program Files (x86)\GNU ARM Eclipse\Build Tools\2.6-201507152002\bin";...C:\Program Files (x86)\GNU Tools ARM Embedded\5.2 2015q4\bin;...]
Естественно, не работает.
Исправил переменную PATH в настройках проекта (Properties/C++ Build/Environment) - убрал лишнее, поставил кавычки на всех путях sm.gif.
Все равно не работает.
Обновлено:
При перезаписывании свойств проекта в дереве проекта появляется папка Includes с подпапками "C:\Program Files (x86)\GNU Tools ARM Embedded\5.2 2015q4\..." и при попытке сборки Eclipse выдает уже такие сообщения:
Код
15:16:07 **** Incremental Build of configuration Default for project 1-EventFlag ****
make all
--- building 1-EventFlag
process_begin: CreateProcess(NULL, mkdir ./obj, ...) failed.
make (e=2): Не удается найти указанный файл.
<...>
--- compiling ./src/main.cpp...
./src/main.cpp:128:1: fatal error: opening dependency file obj/main.d: No such file or directory
}
^
compilation terminated.

Т.е. теперь make запускается, но почему-то не может выполнить команды mkdir. sad.gif
IgorKossak
Я делаю несколько иначе.
Я не пользуюсь настройками в Global Tool Paths. Т. е. пути там есть, но я не уверен, что среда ими пользуется.
Я создаю переменные ToolchainPath и CoreutilsPath типа Directory в Preferences/C++/Build/Build Variables, без кавычек.
Потом в Preferences/C++/Build/Environment создаю переменную PATH со значением ${CoreutilsPath};${ToolchainPath}, ниже надо выбрать Append variables to native environment, применить нажав Apply, OK.
Разумеется, в системной переменной PATH этих путей быть не должно.
Так всё работает.
Harvester
Цитата(IgorKossak @ Feb 24 2016, 22:14) *
Я делаю несколько иначе.
Я не пользуюсь настройками в Global Tool Paths. Т. е. пути там есть, но я не уверен, что среда ими пользуется.
Я создаю переменные ToolchainPath и CoreutilsPath типа Directory в Preferences/C++/Build/Build Variables, без кавычек.
Потом в Preferences/C++/Build/Environment создаю переменную PATH со значением ${CoreutilsPath};${ToolchainPath}, ниже надо выбрать Append variables to native environment, применить нажав Apply, OK.
Разумеется, в системной переменной PATH этих путей быть не должно.
Так всё работает.

А у меня почему-то нет sad.gif
Но за совет спасибо.
Harvester
Цитата(Harvester @ Feb 24 2016, 12:34) *
При попытке сборки Eclipse выдает такие сообщения:
Код
15:16:07 **** Incremental Build of configuration Default for project 1-EventFlag ****
make all
--- building 1-EventFlag
process_begin: CreateProcess(NULL, mkdir ./obj, ...) failed.
make (e=2): Не удается найти указанный файл.
<...>
--- compiling ./src/main.cpp...
./src/main.cpp:128:1: fatal error: opening dependency file obj/main.d: No such file or directory
}
^
compilation terminated.

Т.е. теперь make запускается, но почему-то не может выполнить команды mkdir. sad.gif

Порывшись по форуму кажется нашел причину - make вместо sh.exe запускает cmd.exe. А почему так происходит и как это исправить - нигде не могу найти. crying.gif
AHTOXA
А sh.exe лежит в PATH?
Harvester
Цитата(AHTOXA @ Feb 26 2016, 22:01) *
А sh.exe лежит в PATH?

Да, в одной папке с make.
AHTOXA
А mkdir.exe там присутствует?
Он нужен, потому что mkdir - это встроенная команда cmd.exe, и sh.exe не умеет её запускать.
(mkdir.exe и ещё несколько нужных программ я брал, емнимс, из какого-то древнего winavr (в директории utils/bin)).
Harvester
Цитата(AHTOXA @ Feb 27 2016, 09:30) *
А mkdir.exe там присутствует?
Он нужен, потому что mkdir - это встроенная команда cmd.exe, и sh.exe не умеет её запускать.
(mkdir.exe и ещё несколько нужных программ я брал, емнимс, из какого-то древнего winavr (в директории utils/bin)).

Там присутствует busybox, который поддерживает эту команду. Доказательство:
Код
D:\Users\Андрей>sh
~ $ mkdir
BusyBox v1.24.0.git (2015-07-15 20:12:15 UTC) multi-call binary.

Usage: mkdir [OPTIONS] DIRECTORY...

Create DIRECTORY

        -m MODE Mode
        -p      No error if exists; make parent directories as needed
~ $

Т.е. из командной строки mkdir запускается.
Я заменил в make-файле строку
Код
MD = mkdir
на
Код
MD = busybox mkdir

и проект начал собираться
Попробовал последовать вашему совету - положил в папку mkdir.exe и msys.dll из WinAVR - исходный make-файл заработал.

В общем, задача решена, но осадочек 05.gif остался.
Спасибо за подсказку beer.gif
IgorKossak
Не знаю, что было в древнем WinAVR. Нормальный набор утилит брал здесь.
Busybox тоже неплохо, но размер у неё больше и работает она медленнее, поскольку "всё в одном".
Harvester
Цитата(IgorKossak @ Feb 27 2016, 16:27) *
Не знаю, что было в древнем WinAVR. Нормальный набор утилит брал здесь.
Busybox тоже неплохо, но размер у неё больше и работает она медленнее, поскольку "всё в одном".

Ну, вообще говоря, этот набор еще древнее, т.к. последний релиз WinAVR датируется 2010 годом. laughing.gif
Но это уже не столь принципиально.
Harvester
Цитата(AHTOXA @ Oct 9 2014, 07:28) *

Добрый день. Не моли бы Вы пояснить пару моментов.
1. В вашем makefile имеется отдельная переменная SRCS, как я понял из комментария, для подключения индивидуальных исходных файлов.
Однако если просто добавить файл в эту переменную, то выдается ошибка
Код
make: *** No rule to make target '../obj/kernel.o', needed by '../kernel.elf'.

Если же добавить путь к этому файлу в переменную DIRS, то он скомпилируется и без указания в SRCS.
Какой тогда смысл в переменной SRCS?
2. Ваши примеры собираются нормально, а когда я пытаюсь собрать свой проект, линкер выдает сообщение:
Код
arm-none-eabi-ld: unrecognised emulation mode: thumb
Supported emulations: armelf
makefile:146: recipe for target '../kernel.elf' failed

Инструментарий один и тот же, флаги линкера тоже.
В чем может быть причина?
P.S. Со вторым вопросом разобрался: Вы вызываете линкер через g++, а у меня был указан ld.
AHTOXA
Цитата(Harvester @ Mar 22 2016, 17:10) *
1. В вашем makefile имеется отдельная переменная SRCS, как я понял из комментария, для подключения индивидуальных исходных файлов.
Однако если просто добавить файл в эту переменную, то выдается ошибка
Код
make: *** No rule to make target '../obj/kernel.o', needed by '../kernel.elf'.

Если же добавить путь к этому файлу в переменную DIRS, то он скомпилируется и без указания в SRCS.
Какой тогда смысл в переменной SRCS?

Идея была в том, чтобы подцепить какие-то файлы выборочно. (Если добавить директорию с файлом к DIRS, то подцепятся все файлы из этой директории).
Но как-то ни разу не пригождалось такое, вот и не доделал.
Чтобы заработало, надо добавить пути к этим индивидуально добавленным файлам в переменную VPATH. Найдите строчку с VPATH и измените её на:
Код
    VPATH := $(DIRS) $(dir $(SRCS))

Тогда всё заработает как задумано.
Harvester
Понял, спасибо.
temiru
такая же ошибка
krav2016
Устанавливал дополнения к Eclipse и попутно написал краткое руководство. В статье рассмотрен порядок установки среды разработки ECLIPSE и дополнительных компонентов к ней для программирования и отладки микропроцессоров с ядром ARM. Возможно, кому-то пригодится.
Если у вас есть дополнения или исправления по данной теме – пишите, добавлю в руководство. Смотрите вложение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.