allsettingsdone 0 3 августа, 2014 Опубликовано 3 августа, 2014 (изменено) · Жалоба Не получается собрать простенький проект на С++ в Sublime text2. Использую компилятор gcc(GNU Tools ARM Embedded), программу make с самописным простеньким makefile. Пути для gcc и make прописаны в PATH. Вот что пытаюсь собрать: int main() { } Вот настройки проекта sublime text2: { "folders": [ { "path": "." } ], "build_systems": [ { "name": "arm build", "cmd": ["make"], "working_dir": "${project_path}" } ], "settings": { "sublimeclang_options": [ "-std=c++11", "-Wall", "-I${project_path}" ] } } Содержимое makefile: all: arm-none-eabi-gcc main.cpp Вот что получаем на выходе: arm-none-eabi-gcc main.cpp c:/program files (x86)/gnu tools arm embedded/4.8 2014q2/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib\libc.a(lib_a-exit.o): In function `exit': exit.c:(.text.exit+0x2c): undefined reference to `_exit' collect2.exe: error: ld returned 1 exit status make: *** [all] Error 1 [Finished in 0.4s with exit code 2] Как вы думаете, в чем проблема? проект прикрепляю: sm20.zip Изменено 3 августа, 2014 пользователем allsettingsdone Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 3 августа, 2014 Опубликовано 3 августа, 2014 (изменено) · Жалоба Ну так библиотек никаких не указано... Обычно в embedded проектах "стартап" включается в него разработчиком. Я, например, предпочитаю чтобы для основной программы неинициализированные переменные уже были "0", это всё (как и работала инициализация - переписывается из flash в ОЗУ) само собой не происходит. Как-то так: void ResetException(void) { arm_cpu_initialize(); // watchdog disable, clock initialize /* copy-init variables */ memcpy(& __data_start__, & __etext, (& __data_end__ - & __data_start__) * sizeof __bss_end__); /* zero-init variables */ memset(& __bss_start__, 0, (& __bss_end__ - & __bss_start__) * sizeof __bss_end__); /* Branch to main function */ main(); /* Infinite loop */ for (;;) ; } Для Вашего случая лекарство вот: void _exit(int v) { for (;;) ; } void exit(int v) { for (;;) ; } Но зашивать в ПЗУ это не получится... Изменено 3 августа, 2014 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
allsettingsdone 0 3 августа, 2014 Опубликовано 3 августа, 2014 (изменено) · Жалоба ... Дело в том что не нужны костыли в проекте, для того что бы та или иная ошибка не выскакивала. Я бы хотел сделать "скелетный" проект для Sublime text2, и насколько я понимаю, эта ошибка появляется из-за того что я передаю в компилятор слишком мало параметров о самом микроконтроллере, и(или) не подключаю к проекту файл "startup_stm32f10x_md_vl.s". Тут кстати возникает вопрос - как правильно подключить этот файл к проекту? И какая разница компилятору подключен он или нет? Изменено 4 августа, 2014 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 3 августа, 2014 Опубликовано 3 августа, 2014 · Жалоба Дело в том что не нужны костыли в проекте, для того что бы та или иная ошибка не выскакивала. Я бы хотел сделать "скелетный" проект для Sublime text2 При чём тут вообще Sublime text? Вам надо найти нормальный makefile. Именно из него компилятор и узнает, какие файлы у вас подключены и с какими ключами их компилировать. Например, посмотрите пример от scmRTOS, там есть работающий makefile. (И стартап, про необходимость которого вам сказал Genadi Zawidowski, там тоже есть.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
psL 0 3 августа, 2014 Опубликовано 3 августа, 2014 · Жалоба startup нужен для начальной инициализации процессора (прерываний, стека и т.п.), т.е. для создания окружения в котором уже м.б. запущена функция main. В этом файле обычно содержится нулевой вектор, откуда стартует программа при подаче питания или сбросе, а также вызов функции main. Поскольку ОС отсутствует, программа обычно не возвращает никуда управления, а остается в вечном цикле for(;;){} или while(1) Поскольку он у вас отсутствует, линкер ищет функцию для передачи управления по завершению main Насколько понимаю, Sublime это просто стучалка, у которой есть возможность вызова make для проекта. Самый простой способ разобраться со связкой компилятора и редактора - научиться сначала компилировать проект из командной строки. Например, можно взять референсный код мигания светодиодом или аналогичный для вашего или похожего процессора и научиться собирать его при помощи make. Далее подтянуть редактор. Далее уже заниматься программированием конкретной задачи под конкретный процессор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 3 августа, 2014 Опубликовано 3 августа, 2014 (изменено) · Жалоба Вот Makefile проект под STM32F1xx - только запуск. Обратите внимание на размер ПЗУ и ОЗУ в файле *.ld Изменено 3 августа, 2014 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 4 августа, 2014 Опубликовано 4 августа, 2014 · Жалоба startup нужен для начальной инициализации процессора (прерываний, стека и т.п.), т.е. для создания окружения в котором уже м.б. запущена функция main. В этом файле обычно содержится нулевой вектор, откуда стартует программа при подаче питания или сбросе, а также вызов функции main. Стартап не выполняет никакой инициализации аппаратуры (типа прерываний и т.п.), а только готовит программное окружение для выполнения си-кода (инит статитческих/глобальных переменных, памяти, стеков, режимов CPU и т.п.). Аппаратуру можно начинать инитить уже в main(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
allsettingsdone 0 4 августа, 2014 Опубликовано 4 августа, 2014 · Жалоба Так.. В первую очередь мне надо разобраться с синтаксисом makefile и *.ld , понять что за что отвечает и дальше уже пытаться собрать проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 4 августа, 2014 Опубликовано 4 августа, 2014 · Жалоба ...надо разобраться с синтаксисом makefile... ничего сложного в этой бодяге нет. с годами что то добавляется, что то уходит. разные языки(среды), разные обработчики мэйк файлов. но суть одна и та-же. очень поможет какой-либо пример. в инете их как грязи. Вам нужно готовый, с мэйк файлом. потом по образу и подобию пытаетесь запустить своё(как хочется, или как вы кумекаете). нарываетесь на конкретные проблемы. решаете конкретные проблемы. не забываем про встроенные хэлпы, форумы с кучей избытыми вопросами-ответами. как правило, если это не квантовый генератор, для полёта к марсу в единственном полусекретном варианте - то всё уже тысячу раз пройдено другими людьми. надо просто найти ключевые фразы, которые Вас выведут точно на самые полные ответы(для вас)... ну и по кругу, пока сами с усами не станете. Так же не забываем про другие источники инфы - книги, редко научные институтские статьи, иногда для практических рукамидвижений выручает и всевозможные видио - которые сейчас делают все кому не лень, в том числе и народу от техники/электроники/прграммирования... ну где то так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться