реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Code Red Suit v2.0, Среда разработки на базе эклипса
Vitaliy_ARM
сообщение Oct 1 2009, 11:15
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(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, который был сделан мной для сравнения).
Попытался подключить вторую версию либ, код примерно такой же.
Вопрос, можно ли где-то прописать, чтобы компилятор вкомпиливал либы, только те, которые используются проектом?


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Oct 2 2009, 15:38
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



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


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Petka
сообщение Oct 2 2009, 15:44
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



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

Код
int i;

?
Для каких целей? Сами её хотите инициализировать?
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Oct 2 2009, 15:51
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(Petka @ Oct 2 2009, 19:44) *
Код
int i;

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


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

в коде:

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

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


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Petka
сообщение Oct 2 2009, 15:59
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



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


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

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

val_a = str_ptr->a; // обращение по адресу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 3 2009, 14:51
Сообщение #21


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Oct 5 2009, 08:32
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(demiurg_spb @ Oct 3 2009, 18:51) *
Для avr-gcc так:
Код
uint8_t foo __attribute__((section(".noinit")));

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

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


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

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


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Oct 5 2009, 14:20
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(demiurg_spb @ Oct 3 2009, 18:51) *
Для avr-gcc так:
Код
uint8_t foo __attribute__((section(".noinit")));


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

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

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


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Flexz
сообщение Oct 5 2009, 20:24
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



А как у вас секция "батареечной памяти" в скрипте линкера описана? Если не ошибаюсь - копать надо туда
Go to the top of the page
 
+Quote Post
klen
сообщение Oct 6 2009, 07:10
Сообщение #25


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



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

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

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

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

нада проверить... laughing.gif
Go to the top of the page
 
+Quote Post
Make_Pic
сообщение Oct 6 2009, 13:27
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



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

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

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

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

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


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

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016