Vitaliy_ARM 0 1 октября, 2009 Опубликовано 1 октября, 2009 · Жалоба Какая-то ерудна с линкером. Вот не прошло и пол года: http://electronix.ru/forum/lofiversion/index.php/t58320.html а вектора стали называться по другому :07: В общем линкер как линкер. Все нормально. Геммор был со средой разработки. Мне на диске прислали версию среды 2.0.10. Я ее проабдейтил через нет до 2.0.16. После почти двухнедельной переписки, когда один и тот же проект у меня не работал, а у службы поддержки работал. :smile3046: , они мне прислали ссылку на последнюю версию, не требующую абдейтов: ftp://code-red-tech.com/RedSuite2/red_suite_2.exe Итог такой, что среда, видимо, впоймала глюка при абдейте. Скачал и все стало сразу шеколадно на 90% :08: . Нерабочий проект стал сразу рабочим. если вдруг кому то понадобится ответ на вопрос, как разместить константу во флешь по указанному адресу: В коде так: const BYTE OurIpAddr[4] __attribute__ ((section(".ipaddr"))) = {192,168,1,4}; В скрипте линкера так: .ipaddr : { . = ALIGN(4); KEEP(*(.ipaddr)) } > IP_MEM Однако, как оказалось, еще рано радоваться. У меня все проекты написаны на C++. Создаю шаблон проекта на C++ (в среде заложена такая возможность). И классы там не компилятся!!! Пишу в службу поддержки, а они и говорят: Hi, You need to link with a different library - use Newlib (nohost)or Newlib (semihost). See: http://support.code-red-tech.com/CodeRedWiki/CLibrary Also, there is a mistake in the startup code for C++. Please remove the lines: LDR r3, .def__libc_init_array CMP r3, #0 BEQ .setup_main in .cppinit in cr_startup.s Действительно, поменял строчки, где эти библиотеки подключаются на GROUP(libgcc.a libc.a libcr_newlib_nohost.a) , в все сразу стало хорошо. Проект скомпилировался и на C++! Однако компилятор написал, что кода получилось 28кБ вместо примерно 10кБ :salmari: (столько занимает аналог проекта на языке C, который был сделан мной для сравнения). Попытался подключить вторую версию либ, код примерно такой же. Вопрос, можно ли где-то прописать, чтобы компилятор вкомпиливал либы, только те, которые используются проектом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 2 октября, 2009 Опубликовано 2 октября, 2009 · Жалоба Итог такой: про C и Cpp Newlib is a complete C/C++ library, including *every* function from the standard. For C applications, we have developed Redlib, which is a smaller library designed for embedded applications, an is significantly smaller than Newlib. Unfortunately, we have developed it for C and not C++ - very, very few customers use C++ in an embedded environment. C++ сразу съедает 20кБ кода, размещая туда свои либы. В общем среда чуть сложнее, чем яр. И гораздо проще, нежели самопальное подключение связки GCC+Eclipse+GDB с джитагами на FTDI2232. Пользоваться можно. Еще удивило отсутствие мейк файлов. Среда сама включает все файлы, которые она видит в дереве проекта при компиляции. :) Появился жизненно важный вопрос по компилятору GCC. Как задать неинициализируемую переменную (не могу найти подходящего _attribute_)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Petka 0 2 октября, 2009 Опубликовано 2 октября, 2009 · Жалоба Появился жизненно важный вопрос по компилятору GCC. Как задать неинициализируемую переменную (не могу найти подходящего _attribute_)? int i; ? Для каких целей? Сами её хотите инициализировать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 2 октября, 2009 Опубликовано 2 октября, 2009 · Жалоба int i; ? Для каких целей? Сами её хотите инициализировать? typedef struct Abcd { int a; int b; int c; }XYZ; в коде: XYZ str; <- инициализируется нулями. Цель простая, в батаеечной памяти лежат данные, которые нельзя затрать прошивкой при отладке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Petka 0 2 октября, 2009 Опубликовано 2 октября, 2009 · Жалоба Цель простая, в батаеечной памяти лежат данные, которые нельзя затрать прошивкой при отладке. Понятно. Тогда вам требуется изучить скрипты линкера. Воспользуйтесь поиском по форуму. Неоднократно обсуждалось. P.S. Или можно воспользоваться обращением к структуре по адресу, где адрес вручную указывает на батареечную память. Но этот способ идеологически не совсем правильный. XYZ* str_ptr=(XYZ*)0xFEED; // никакой памяти не обнулится. val_a = str_ptr->a; // обращение по адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 3 октября, 2009 Опубликовано 3 октября, 2009 · Жалоба Появился жизненно важный вопрос по компилятору GCC. Как задать неинициализируемую переменную (не могу найти подходящего _attribute_)? Для avr-gcc так: uint8_t foo __attribute__((section(".noinit"))); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 5 октября, 2009 Опубликовано 5 октября, 2009 · Жалоба Для avr-gcc так: uint8_t foo __attribute__((section(".noinit"))); Ближе, но не то. В общем структура уже сидит в секции батареечной памяти. В другую пихать нельзя. Понятно. Тогда вам требуется изучить скрипты линкера. Воспользуйтесь поиском по форуму. Неоднократно обсуждалось. Наверное, вопрос нужно задать так, потому что, нужный мне ответ утонул, найти не могу: Как в скрипте линкера указать, что именно эта секция не должна инициализироваться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 5 октября, 2009 Опубликовано 5 октября, 2009 · Жалоба Для avr-gcc так: uint8_t foo __attribute__((section(".noinit"))); Похоже , что эта конструкция в ARM GCC задается так: int i __attribute__ ((section("nocommon"))); Так не инициализируются обычные переменные. Но у меня структура уже сидит в своей секции и инициализируется нулями. :01: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 5 октября, 2009 Опубликовано 5 октября, 2009 · Жалоба А как у вас секция "батареечной памяти" в скрипте линкера описана? Если не ошибаюсь - копать надо туда Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба я так понимаю все это области ОЗУ? ход мыслей такой. 1.описать область памяти этой Вашей батарейной области в скрипте (адрес и размер) 2.не использовать эту секцию на запись (не говорить что ее нада ложить в озу или флеш). 3 в С коде просто объявить структуру в этой секции (.data копируются из флеша, .bss - обнуляется, а другие секции вообще по идее не должны трогатся никем, ведь все эти телодвижения в startup code реализуются) для lpc2148 у меня так сделано с кусками RAM - буфера USB модуля которые на тойже шине что и сам модуль. я не проверял но писатся туда ничего не должно при прошивке и отладке. нада проверить... :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Make_Pic 0 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба я так понимаю все это области ОЗУ? ход мыслей такой. 1.описать область памяти этой Вашей батарейной области в скрипте (адрес и размер) 2.не использовать эту секцию на запись (не говорить что ее нада ложить в озу или флеш). 3 в С коде просто объявить структуру в этой секции (.data копируются из флеша, .bss - обнуляется, а другие секции вообще по идее не должны трогатся никем, ведь все эти телодвижения в startup code реализуются) для lpc2148 у меня так сделано с кусками RAM - буфера USB модуля которые на тойже шине что и сам модуль. я не проверял но писатся туда ничего не должно при прошивке и отладке. нада проверить... :laughing: Специально залез сюда, чтобы еще раз спросить - Вы можете помочь собрать драйверы под BDM или хотя бы рассказать как это делать, но для этого надо взглянуть в мою тему: Нужно собрать под WIN32 BDM драйверы прошу помощи, For klen Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться