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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Нехватка памяти IAR AVR
al_tele
сообщение Aug 26 2009, 12:08
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 26-08-09
Пользователь №: 52 052



ATmega48. Нужна помощь срочно. Казалось бы простоя штука.
__flash char *Mess[10] = {
"11111111111111111111111111111111111111111111111111111111\r",
.
.
.
.
"999999999999999999999999999999999999999999999999999999999\r"
};
int main(void)
{
int k;
for(k=0;k<10;++k)
out_str(Mess[k]);
}

выделяется массив в памяти программ(flash) - но компилятор ругается на RAM - где тут расход оперативки?
что то не настроил???

Error[e16]: Segment NEAR_Z (size: 0x13 align: 0) is too long for segment definition. At least 0xa more bytes needed. The problem occurred while
processing the segment placement command "-Z(DATA)NEAR_I,NEAR_Z,NEAR_N=_..X_SRAM_BASE-_..X_SRAM_END", where at the moment of
placement the available memory ranges were "DATA:2f7-2ff"
Reserved ranges relevant to this placement:
DATA:100-13f CSTACK
DATA:140-15f RSTACK
DATA:160-2ff NEAR_I
Error while running Linker
Total number of errors: 1
Total number of warnings: 0
Go to the top of the page
 
+Quote Post
another_one
сообщение Aug 26 2009, 12:40
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 252
Регистрация: 2-03-08
Пользователь №: 35 557



Можно в *.XCL файле подкоректировать значение для NEAR_I, подогнать так, если позволяют ресурсы ОЗУ, чтобы диапазон был не 160-2ff(как сейчас), а 160-2ff + 0xa.


--------------------
One Chip is All You Need
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 26 2009, 12:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(al_tele @ Aug 26 2009, 20:08) *
ATmega48. Нужна помощь срочно. Казалось бы простоя штука.
__flash char *Mess[10]...
Потому что у Вас объявлен массив указателей на строки. Указатели расположены в памяти программ, ну а сами строки в памяти данныхsmile.gif


--------------------
Go to the top of the page
 
+Quote Post
al_tele
сообщение Aug 26 2009, 13:01
Сообщение #4





Группа: Участник
Сообщений: 5
Регистрация: 26-08-09
Пользователь №: 52 052



спасибо за ответ. Ну не знаю я где такой файл smile.gif . ну дело же не в этом - просто увеличить кусок памяти - куда делось 400 байт памяти оперативной???????? вот в чем вопрос!!!! Вот не пойму - то ли глюк компилятора - то ли есть какие то тонкости в объявлениях итд???

Цитата(prottoss @ Aug 26 2009, 15:53) *
Потому что у Вас объявлен массив указателей на строки. Указатели расположены в памяти программ, ну а сами строки в памяти данныхsmile.gif


Хорошо - спасибо!!! Знаете - я пишу под ARM уже почти 10 лет(Keil) и таких чудес не видел. Если я написал const - все - это flash. Т.е. этот массив строк все равно будет во flash памяти расположен - а потом при старте перегониться в оперативную память????? Ну это же фантастика!!!! Тогда как объявить что бы не жрать оперативку????
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 26 2009, 13:16
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(al_tele @ Aug 26 2009, 21:01) *
...Тогда как объявить что бы не жрать оперативку????
Можно вот так:
Код
__flash  char Mess[10][64] = {
                                         "11111111111111111111111111111111111111111111111111111111\r",
                                         .
                                         .
                                         .
                                         .
                                        "999999999999999999999999999999999999999999999999999999999\r"                        
                       };
Правда, все строки будут одинаковой длины.


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 26 2009, 13:26
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(al_tele @ Aug 26 2009, 15:01) *
Хорошо - спасибо!!! Знаете - я пишу под ARM уже почти 10 лет(Keil) и таких чудес не видел. Если я написал const - все - это flash.

Значит плохо пишите sad.gif, раз не отличаете указатели расположенные во flash, от расположения во flash данных на которые они указывают. В данном случае, Вы совершенно определенно расположили во flash только указатели. Другое дело, что AVR есть AVR и __flash * __flash не прокатят....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
al_tele
сообщение Aug 26 2009, 14:14
Сообщение #7





Группа: Участник
Сообщений: 5
Регистрация: 26-08-09
Пользователь №: 52 052



так как же расположить данные во flash и как можно передавать в качестве аргумента функции адрес определенной части этих данных - ну ясно используя IAR AVR C компилятор. На ассемблере то вопросов нет!!!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 26 2009, 14:51
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(al_tele @ Aug 26 2009, 16:14) *
так как же расположить данные во flash и как можно передавать в качестве аргумента функции адрес определенной части этих данных - ну ясно используя IAR AVR C компилятор. На ассемблере то вопросов нет!!!

А, что, 10 лет программирования не хватило, дабы догадаться, что ручками, как минимум, можно?
Код
__flash char msg0[] = "111111111111111111111111111111111111111111111111111111\r";
......

char __flash * __flash Mess[10] = {

    msg0,
.......
};


Сообщение отредактировал zltigo - Aug 26 2009, 15:09


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Aug 26 2009, 19:36
Сообщение #9


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

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Припоминается ещё вариант с коллекцией (items, что ли).
он удобен при последовательном вынимании элементов из коллекции.
объявляется примерно так
Код
__flash сhar Messages [] =
"Preved medved!\r\0"
"i poka!\r\0"
"a podkrepitsja est?\r\0"
;

т.е. массив строк, а в конце ещё один "лишний" конец строки (там за кавычками компилятор один ставит).
а перебирать примерно так (проверить не на чем сейчас, но вроде идея такая)
Код
char __flash * get_next_str( char __flash * pos){
  if(!pos) return ((char __flash *)NULL); //если не инициализирован pos
  pos += strlen(pos) + 1;
  if(*pos) return (pos);
  return ((char __flash *)NULL);
}

надеюсь, сам порядок размещения модификаторов не попуталwink.gif
Ну и тут strlen должен уметь считать строки во flash (или принимать __generic).
Двигать указателями в AVR, конечно, не так быстро, как в ARM, но и не всегда спешить надо


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 27 2009, 00:26
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(zltigo @ Aug 26 2009, 17:51) *
char __flash * __flash Mess[10] = {


Цитата
Другое дело, что AVR есть AVR и __flash * __flash не прокатят....

Предлагается найти 10 отличий? smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 27 2009, 05:37
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(defunct @ Aug 27 2009, 02:26) *
Предлагается найти 10 отличий? smile.gif

Отличия достаточно одного, и находится оно находится ровно одной строчкой ниже отцитированного Вами.
Найдите его:
Код
char __flash * __flash Mess[10] = {
    msg0,
....

Код
char __flash * __flash Mess[10] = {
    "11111111111111111111111111111\r",
.....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
al_tele
сообщение Aug 28 2009, 08:48
Сообщение #12





Группа: Участник
Сообщений: 5
Регистрация: 26-08-09
Пользователь №: 52 052



спасибо за помощь - да такая конструкция пошла

__flash char msg0[] = "11111111111111\r\n";
__flash char msg1[] = "22222222222222\r\n";
......
__flash char msg7[] = "HELP or ? - prints help\r\n\r\n";


char __flash * __flash Mess[8] =
{
msg0,
.....
msg7
};


void put_string(char __flash *str)
{
while(*str)
{
usart_put(*str++);
}
}

А уважаемому zltigo хочу дать совет - лучше сарказм всегда оставлять при себе - может проще в жизни будет. И если бы у меня было время вступить в дисскусию по программированию - почему то я знаю кто-бы утерся. За совет по флешовым указателям спаибо(AVR не программировал никогда - заставили).
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 28 2009, 09:27
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(al_tele @ Aug 28 2009, 11:48) *
... почему то я знаю кто-бы утерся...


biggrin.gif
bb-offtopic.gif

Как говорит мой друг: "Прогрес не затронул лишь человеческие взаимоотношения. И спустя тысячу лет - всё тоже. Любовь, ненависть, самоуверенность, измена, предательство... "Себя считали кем-то из немногих...".

С другой стороны, я вот думаю, именно самоуверенность и гордость двигает прогресс вперёт. Без этих качеств была бы шляпа. Жаль что с годами они как-то уходят потиху, испаряются... smile.gif
Go to the top of the page
 
+Quote Post
al_tele
сообщение Sep 2 2009, 05:30
Сообщение #14





Группа: Участник
Сообщений: 5
Регистрация: 26-08-09
Пользователь №: 52 052



Цитата(SasaVitebsk @ Aug 28 2009, 13:27) *
biggrin.gif
bb-offtopic.gif

Как говорит мой друг: "Прогрес не затронул лишь человеческие взаимоотношения. И спустя тысячу лет - всё тоже. Любовь, ненависть, самоуверенность, измена, предательство... "Себя считали кем-то из немногих...".

С другой стороны, я вот думаю, именно самоуверенность и гордость двигает прогресс вперёт. Без этих качеств была бы шляпа. Жаль что с годами они как-то уходят потиху, испаряются... smile.gif


ну самоуверенность и гордость - это одно, а выпендриваться это другое - тем более как показывает мой жизненный опыт - это как правило на пустом месте. Если мне в работе не приходилось работать на МК с гарвардской архитектурой(а тут сразу появляются тонкости с указателями) - это не означает что можно умничать - знаешь - ну подскажи - не хочешь - промолчи. Но хамить не надо. Я очень люблю еще одно выражение - "где же твои деньги - раз ты такой умный".
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 2 2009, 05:57
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(al_tele @ Sep 2 2009, 08:30) *
тем более как показывает мой жизненный опыт
не приходилось работать на МК с гарвардской архитектурой

Дык расскажите про свой богатый жизненный опыт.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:30
Рейтинг@Mail.ru


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