Перейти к содержанию
    

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Появился жизненно важный вопрос по компилятору GCC.

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

int i;

?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

int i;

?

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

 

typedef struct Abcd

{

int a;

int b;

int c;

}XYZ;

 

в коде:

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

P.S.

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Появился жизненно важный вопрос по компилятору GCC.

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

Для avr-gcc так:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для avr-gcc так:

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

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

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для avr-gcc так:

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

 

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как у вас секция "батареечной памяти" в скрипте линкера описана? Если не ошибаюсь - копать надо туда

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

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

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...