Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Code Red Suit v2.0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Vitaliy_ARM
Приобрели эту среду, так как очень хотелось иметь среду на базе эклипса с нормальным дебагером.
Среда на базе эклипса 3.3 и гнушного компилятора gcc 4.2.0. Этот вариант гораздо бюджетнее IAR.
О нем можно почитать здесь: www.code-red-tech.com

В кратце о среде:
Джитаг собран на FT2232, максимальная скорость - 6МГц. По сравнению с IAR,
работает заметно медленнее.
Геммора с настройкой проекта практически нет (C-проекта).
На мой взгляд, очень удачное решение для тех, кому нравится эклипс.

Со средой вместе идут несколько проектов, в частности для LPC17xx и LPC23xx/24xx. и гигобайтная флешка rolleyes.gif с фирменным лабелом.
Все проекты написаны на C, компилируются и работают сностно. При создании
проекта на С, автоматически генерируются 3 файла для компановщика.

При создании проекта на C++ так же генерятся три файла скрипта компановщика, в которых отсутствуют секции для конструкторов и прочее. cranky.gif
При использовании обычного класса компановщик начинает ругаться непонятными ошибками:
Код
make all
Building target: BootCR.axf
Invoking: MCU C++ Linker
arm-none-eabi-c++ -nostdlib -Xlinker --gc-sections -Xlinker -Map=BootCR.map -mcpu=arm7tdmi -T BootCR.ld -o"BootCR.axf"  ./src/DoCmd.o ./src/Emac.o ./src/Fldr.o ./src/PortIO.o ./src/Rc6.o ./src/Stip.o ./src/TestPins.o ./src/cr_startup.o ./src/main.o  
c:/code_red/red_suite/tools/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib\libc.a(lib_a-abort.o): In function `abort':
abort.c:(.text+0xc): undefined reference to `_exit'
c:/code_red/red_suite/tools/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text+0x4): undefined reference to `_getpid'
c:/code_red/red_suite/tools/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text+0x2c): undefined reference to `_kill'
c:/code_red/red_suite/tools/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
collect2: ld returned 1 exit status
make: *** [BootCR.axf] Error 1


Был у меня еще один проект, который собирался в gcc ранней версии (уже не помню в какой). Путем колдовства и добавления секций, таких как .сtors и .dtors результата не принесло,
только ошибки сменились. Потом засунул скрипт от старого проекта линкеру. Написал, что все скомпилилось с размером кода 0.
Вывод пока такой, что ребята не доделали поддержку C++ (генерятся неправильные файлы линковщика). Возможность вставлять свой файл есть.
Приведу изначальный скрипт компановщика.
Может кто знает, чего там не хватает, может кто-то уже использует эту среду с С++?
AHTOXA
Цитата(Vitaliy_ARM @ Sep 1 2009, 20:11) *
Код
c:/code_red/red_suite/tools/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'


Никакой code red не избавит от необходимости изучать кишочки gcc smile.gif

Попробуйте добавить в проект вот этот файлик: Нажмите для просмотра прикрепленного файла

Это минимальный набор системных вызовов. В каком-нибудь своём .cpp определите
Код
extern "C" int putChar(int ch);
int putChar(int ch)
{
    uart0.putch(ch);
    return ch;
}


Хотя скорее всего всё это уже есть в какой-нибудь их библиотеке, надо просто указать в какой.

Цитата
Приведу изначальный скрипт компановщика.
Может кто знает, чего там не хватает, может кто-то уже использует эту среду с С++?


Ну ctors там есть. Возможно там сделано иначе, через .init_array

Попробуйте что-то вроде этого:
Код
    .text :
    {
        __ctors_start__ = .;
        *(.init_array)
        __ctors_end__ = .;
        __dtors_start__ = .;
        __dtors_end__ = .;
        KEEP(SORT(*)(.init_array))
        
        . = ALIGN(4);
        *(.text)                   /* remaining code */
        *(.text.*)                   /* remaining code */
        *(.rodata)                 /* read-only data (constants) */
        *(.rodata*)

        *(.eh_frame_hdr)
        *(.eh_frame)
        *(.ARM.extab* .gnu.linkonce.armextab.*)
        *(.gcc_except_table)
        *(.eh_frame_hdr)
        *(.eh_frame)

        *(.glue_7)
        *(.glue_7t)
        . = ALIGN(4);
    } >FLASH


секции .ctors и .dtors уберите.

Вот тут про .eh_frame.

Ну а вообще, раз купили, то можно напрячь продавца, наверноеsmile.gif
Vitaliy_ARM
Цитата(AHTOXA @ Sep 1 2009, 21:54) *
Ну а вообще, раз купили, то можно напрячь продавца, наверноеsmile.gif


Они сильно не напрягаются. В терре сказали что это еще пока группа интузиастов. Пробовал перед
покупкой написать им на маил, ответа не было. Потом раза три пытался позвонить. Трубку не брали.
Повторно написал на маил, с вопросом как купить? Написали, что покупайте джитаг в терраэлектронике и дали ссылку,
а лицензию на программу у нас smile.gif .

А вообще впечатления от компилера: проект был скомпилирован в IAR, занимал 7кБ, (директива оптимизации - Speed)
после перенесения его на язык С и компиляции в этом компиляторе, проект стал занимать 10кБ (директива оптимизации -O3) wacko.gif
msalov
 
Цитата(Vitaliy_ARM @ Sep 2 2009, 11:22) *
А вообще впечатления от компилера: проект был скомпилирован в IAR, занимал 7кБ, (директива оптимизации - Speed)
после перенесения его на язык С и компиляции в этом компиляторе, проект стал занимать 10кБ (директива оптимизации -O3) wacko.gif
Вы устанавливаете оптимизацию по скорости, меняете проект и сравниваете обьем? Где логика?
Vitaliy_ARM
Цитата(gotty @ Sep 2 2009, 14:46) *
 Вы устанавливаете оптимизацию по скорости, меняете проект и сравниваете обьем? Где логика?

Просто в этом компиляторе в комбобоксе нету -Os. Прописал в ручную, один фиг, все равно результат тот же.
klen
за что собсно денги уплачены?
за отладчик? причем тут эклипс?
за GCC , так он вообще ничего не стоит.
за эклипс, а чем он отличается от бесплатного?

единственно что могу предположить - библиотеки! больше незачто. но по описанию автра не сложилось за это впечатления.

cranky.gif забавно


вопросы.
Вы упоминули о комбобоксе в котором нет -Os, видимо авторы продукта всетаки написали свой плагин в эклипс, это так? Скриншот этого можно глянуть.

GCC 4.2.0
gcc -v че выдает? чей сборки?

что в качестве libc предложено? собственное чтото как у CrossWorks ( в чем сомневаюсь) или newlib, если newlib то какой версии, какой версии GDB?
Vitaliy_ARM
Цитата(klen @ Sep 2 2009, 15:30) *
за что собсно денги уплачены?

Мы купили пока джитаг. Среда работает с ограничением 8кБ.
Она продается отдельно и стоит порядка 1000$
Деньги берут за плагин эклипса и за то, что у Вас все будет работать сразу smile.gif

Цитата(klen @ Sep 2 2009, 15:30) *
за эклипс, а чем он отличается от бесплатного?

Эклипс с их плагином полностью настроен на работу с их джитагом. Так же среда
позволяет полноценно просмтривать регистры процессоров, внутреннюю память и т.п.
в божеских окнах.

Цитата(klen @ Sep 2 2009, 15:30) *
GCC 4.2.0
gcc -v че выдает? чей сборки?


Выложил скриншот консоли gcc.jpeg

Цитата(klen @ Sep 2 2009, 15:30) *
что в качестве libc предложено? собственное чтото как у CrossWorks ( в чем сомневаюсь) или newlib, если newlib то какой версии, какой версии GDB?

Скажите как посмотреть, посмотрю. rolleyes.gif
klen
вижу плагин, котрый парсит регисты переферии - это гуд

но чето 1000$ както дороговато на мой взгляд.

используется newlib, судя по компиллеру
Vitaliy_ARM
Цитата(klen @ Sep 2 2009, 16:21) *
Вижу плагин, котрый парсит регисты переферии - это гуд
но чето 1000$ как-то дороговато на мой взгляд.

IAR вообще не реальных денег стоит. Этот еще можно купить unsure.gif
klen
ыыы laughing.gif

мож попробуем выдрать "ихний плагин", поглядеть ... все остально даром ненадо.

вообще я даже разбирался с плагинописательством к эклипсу. хотелось сделать парсинг битов регистров переферии. принципиально все просто - просиш IDE создать окошко в нужной группе, сделать интерфейск к командам GDB, прочитать файл обисания регистров и вывести на окно. Несложно. но как дело дошло писания на яве я както затормозил и бросил. жду пока муза опять появится.
Vitaliy_ARM
Цитата(klen @ Sep 3 2009, 10:30) *
ыыы laughing.gif
мож попробуем выдрать "ихний плагин", поглядеть ... все остально даром ненадо.


Можно попробовать. У меня постоянно был геммор с отладчиком. GDB сервер постоянно вылетал, то сбоил, то еще чего нибудь выдавал, например жмешь перепрыгнуть
через функцию, а он туда залетает и потом вешается. Джитаг от Olimex. Сносно работал j-link со своим GDB сервером, но тоже не все было гладко. Короче говоря я надолбался с
бесплатным софтом, но так нормально и не настроил.
Думаю тут надо сначала состыковать это добро между собой, чтобы не глючило. А потом браться за плагин. В коде реде вроде бы свой GDB сервер, с их джитагом вроде работает
более или менее.
Как появится возможность, постараюсь залить на местный фтп эту среду.

Сейчас порюсь с такой проблемой, наверное это больше к линкеру относится. Переписываю свой бутлодер.
Где находятся вектора прерываний в этом коде? (перенос KEEP(*(.isr_vector)) в другую секцию, размещенную по нулевому адресу результата не принесло, может чего упустил?).

Цитата
.text :
{
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
KEEP(*(.init));
KEEP(*(.fini));
} > FLASH

Вот еще нашел такой комментарий в скрипте линкера:
Цитата
/*
Note: (ref: M0000066)
Moving the stack down by 16 is to work around a GDB bug.
This space can be reclaimed for Production Builds.
*/
Vitaliy_ARM
Понял что вектора прерываний находятся полностью в KEEP(*(.isr_vector).

Однако .text должен находиться в в одной секции и после KEEP(*(.isr_vector).
Код
.boot :
    {
        KEEP(*(.isr_vector));
        *(.text*)
        *(.rodata*)        
        
    } > BOOTMEM


Если сделать так:

Код
    .boot :
    {
        KEEP(*(.isr_vector));        
        
    } > BOOTMEM

    .text :
    {
        *(.text*)
        *(.rodata*)  
    } > MFlash512


То дебагер улетает в undefine handler. Получается что вектор резета указывает не на начало .text, а непонятно куда.
В чем может быть дело, как правильно разнести вектора и основную программу?
klen
у меня отладка работает на ура, даже в инлайн конструкторы заходить.

могу ВСЕ в кучу запаковатьь и выложить. сможете сравнить.
Vitaliy_ARM
Цитата(klen @ Sep 3 2009, 17:29) *
у меня отладка работает на ура, даже в инлайн конструкторы заходить.

могу ВСЕ в кучу запаковатьь и выложить. сможете сравнить.


Выкладывайте, будет интересно. А джитаг какой вы используете?

Кстати вот еще интересная ссылка на исходники для их отладочной платы, много чего интересного: http://support.code-red-tech.com/CodeRedWiki/RDB1768Support
Vitaliy_ARM
Какая-то ерудна с линкером. Вот не прошло и пол года: http://electronix.ru/forum/lofiversion/index.php/t58320.html
а вектора стали называться по другому 07.gif
Vitaliy_ARM
Цитата(Vitaliy_ARM @ Sep 4 2009, 16:06) *
Какая-то ерудна с линкером. Вот не прошло и пол года: http://electronix.ru/forum/lofiversion/index.php/t58320.html
а вектора стали называться по другому 07.gif

В общем линкер как линкер. Все нормально. Геммор был со средой разработки.
Мне на диске прислали версию среды 2.0.10. Я ее проабдейтил через нет до 2.0.16.
После почти двухнедельной переписки, когда один и тот же проект у меня не работал, а у службы поддержки работал. smile3046.gif ,
они мне прислали ссылку на последнюю версию, не требующую абдейтов: ftp://code-red-tech.com/RedSuite2/red_suite_2.exe
Итог такой, что среда, видимо, впоймала глюка при абдейте.
Скачал и все стало сразу шеколадно на 90% 08.gif . Нерабочий проект стал сразу рабочим.
если вдруг кому то понадобится ответ на вопрос, как разместить константу во флешь по указанному адресу:
В коде так:
Код
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.gif (столько занимает аналог проекта на языке C, который был сделан мной для сравнения).
Попытался подключить вторую версию либ, код примерно такой же.
Вопрос, можно ли где-то прописать, чтобы компилятор вкомпиливал либы, только те, которые используются проектом?
Vitaliy_ARM
Итог такой: про 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.
Пользоваться можно. Еще удивило отсутствие мейк файлов. Среда
сама включает все файлы, которые она видит в дереве проекта при компиляции. smile.gif

Появился жизненно важный вопрос по компилятору GCC.
Как задать неинициализируемую переменную (не могу найти подходящего _attribute_)?
Petka
Цитата(Vitaliy_ARM @ Oct 2 2009, 19:38) *
Появился жизненно важный вопрос по компилятору GCC.
Как задать неинициализируемую переменную (не могу найти подходящего _attribute_)?

Код
int i;

?
Для каких целей? Сами её хотите инициализировать?
Vitaliy_ARM
Цитата(Petka @ Oct 2 2009, 19:44) *
Код
int i;

?
Для каких целей? Сами её хотите инициализировать?


typedef struct Abcd
{
int a;
int b;
int c;
}XYZ;

в коде:

XYZ str; <- инициализируется нулями.

Цель простая, в батаеечной памяти лежат данные, которые нельзя затрать прошивкой при отладке.
Petka
Цитата(Vitaliy_ARM @ Oct 2 2009, 19:51) *
Цель простая, в батаеечной памяти лежат данные, которые нельзя затрать прошивкой при отладке.


Понятно. Тогда вам требуется изучить скрипты линкера. Воспользуйтесь поиском по форуму. Неоднократно обсуждалось.

P.S.
Или можно воспользоваться обращением к структуре по адресу, где адрес вручную указывает на батареечную память. Но этот способ идеологически не совсем правильный.
Код
XYZ* str_ptr=(XYZ*)0xFEED;  // никакой памяти не обнулится.

val_a = str_ptr->a; // обращение по адресу.
demiurg_spb
Цитата(Vitaliy_ARM @ Oct 2 2009, 19:38) *
Появился жизненно важный вопрос по компилятору GCC.
Как задать неинициализируемую переменную (не могу найти подходящего _attribute_)?
Для avr-gcc так:
Код
uint8_t foo __attribute__((section(".noinit")));
Vitaliy_ARM
Цитата(demiurg_spb @ Oct 3 2009, 18:51) *
Для avr-gcc так:
Код
uint8_t foo __attribute__((section(".noinit")));

Ближе, но не то.
В общем структура уже сидит в секции батареечной памяти. В другую пихать нельзя.

Цитата(Petka @ Oct 2 2009, 19:59) *
Понятно. Тогда вам требуется изучить скрипты линкера. Воспользуйтесь поиском по форуму. Неоднократно обсуждалось.


Наверное, вопрос нужно задать так, потому что, нужный мне ответ утонул, найти не могу:

Как в скрипте линкера указать, что именно эта секция не должна инициализироваться?
Vitaliy_ARM
Цитата(demiurg_spb @ Oct 3 2009, 18:51) *
Для avr-gcc так:
Код
uint8_t foo __attribute__((section(".noinit")));


Похоже , что эта конструкция в ARM GCC задается так:
Код
int i  __attribute__ ((section("nocommon")));

Так не инициализируются обычные переменные.

Но у меня структура уже сидит в своей секции и инициализируется нулями. 01.gif
Flexz
А как у вас секция "батареечной памяти" в скрипте линкера описана? Если не ошибаюсь - копать надо туда
klen
я так понимаю все это области ОЗУ?

ход мыслей такой.

1.описать область памяти этой Вашей батарейной области в скрипте (адрес и размер)
2.не использовать эту секцию на запись (не говорить что ее нада ложить в озу или флеш).
3 в С коде просто объявить структуру в этой секции (.data копируются из флеша, .bss - обнуляется, а другие секции вообще по идее не должны трогатся никем, ведь все эти телодвижения в startup code реализуются)

для lpc2148 у меня так сделано с кусками RAM - буфера USB модуля которые на тойже шине что и сам модуль. я не проверял но писатся туда ничего не должно при прошивке и отладке.

нада проверить... laughing.gif
Make_Pic
Цитата(klen @ Oct 6 2009, 10:10) *
я так понимаю все это области ОЗУ?

ход мыслей такой.

1.описать область памяти этой Вашей батарейной области в скрипте (адрес и размер)
2.не использовать эту секцию на запись (не говорить что ее нада ложить в озу или флеш).
3 в С коде просто объявить структуру в этой секции (.data копируются из флеша, .bss - обнуляется, а другие секции вообще по идее не должны трогатся никем, ведь все эти телодвижения в startup code реализуются)

для lpc2148 у меня так сделано с кусками RAM - буфера USB модуля которые на тойже шине что и сам модуль. я не проверял но писатся туда ничего не должно при прошивке и отладке.

нада проверить... laughing.gif


Специально залез сюда, чтобы еще раз спросить - Вы можете помочь собрать драйверы под BDM или хотя бы рассказать как это делать, но для этого надо взглянуть в мою тему: Нужно собрать под WIN32 BDM драйверы прошу помощи, For klen
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.