Jump to content

    
Sign in to follow this  
Vitaliy_ARM

Code Red Suit v2.0

Recommended Posts

Какая-то ерудна с линкером. Вот не прошло и пол года: 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, который был сделан мной для сравнения).

Попытался подключить вторую версию либ, код примерно такой же.

Вопрос, можно ли где-то прописать, чтобы компилятор вкомпиливал либы, только те, которые используются проектом?

Share this post


Link to post
Share on other sites

Итог такой: про 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_)?

Share this post


Link to post
Share on other sites
Появился жизненно важный вопрос по компилятору GCC.

Как задать неинициализируемую переменную (не могу найти подходящего _attribute_)?

int i;

?

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

Share this post


Link to post
Share on other sites
int i;

?

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

 

typedef struct Abcd

{

int a;

int b;

int c;

}XYZ;

 

в коде:

 

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

 

Цель простая, в батаеечной памяти лежат данные, которые нельзя затрать прошивкой при отладке.

Share this post


Link to post
Share on other sites
Цель простая, в батаеечной памяти лежат данные, которые нельзя затрать прошивкой при отладке.

 

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

 

P.S.

Или можно воспользоваться обращением к структуре по адресу, где адрес вручную указывает на батареечную память. Но этот способ идеологически не совсем правильный.

XYZ* str_ptr=(XYZ*)0xFEED;  // никакой памяти не обнулится.

val_a = str_ptr->a; // обращение по адресу.

Share this post


Link to post
Share on other sites
Появился жизненно важный вопрос по компилятору GCC.

Как задать неинициализируемую переменную (не могу найти подходящего _attribute_)?

Для avr-gcc так:

uint8_t foo __attribute__((section(".noinit")));

Share this post


Link to post
Share on other sites
Для avr-gcc так:

uint8_t foo __attribute__((section(".noinit")));

Ближе, но не то.

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

 

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

 

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

 

Как в скрипте линкера указать, что именно эта секция не должна инициализироваться?

Share this post


Link to post
Share on other sites
Для avr-gcc так:

uint8_t foo __attribute__((section(".noinit")));

 

Похоже , что эта конструкция в ARM GCC задается так:

int i  __attribute__ ((section("nocommon")));

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

 

Но у меня структура уже сидит в своей секции и инициализируется нулями. :01:

Share this post


Link to post
Share on other sites

я так понимаю все это области ОЗУ?

 

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

 

1.описать область памяти этой Вашей батарейной области в скрипте (адрес и размер)

2.не использовать эту секцию на запись (не говорить что ее нада ложить в озу или флеш).

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

 

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

 

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

Share this post


Link to post
Share on other sites
я так понимаю все это области ОЗУ?

 

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

 

1.описать область памяти этой Вашей батарейной области в скрипте (адрес и размер)

2.не использовать эту секцию на запись (не говорить что ее нада ложить в озу или флеш).

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this