|
Нехватка памяти IAR AVR |
|
|
|
Aug 26 2009, 12:08
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 26 2009, 13:01
|
Группа: Участник
Сообщений: 5
Регистрация: 26-08-09
Пользователь №: 52 052

|
спасибо за ответ. Ну не знаю я где такой файл  . ну дело же не в этом - просто увеличить кусок памяти - куда делось 400 байт памяти оперативной???????? вот в чем вопрос!!!! Вот не пойму - то ли глюк компилятора - то ли есть какие то тонкости в объявлениях итд??? Цитата(prottoss @ Aug 26 2009, 15:53)  Потому что у Вас объявлен массив указателей на строки. Указатели расположены в памяти программ, ну а сами строки в памяти данных  Хорошо - спасибо!!! Знаете - я пишу под ARM уже почти 10 лет(Keil) и таких чудес не видел. Если я написал const - все - это flash. Т.е. этот массив строк все равно будет во flash памяти расположен - а потом при старте перегониться в оперативную память????? Ну это же фантастика!!!! Тогда как объявить что бы не жрать оперативку????
|
|
|
|
|
Aug 26 2009, 13:16
|

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

|
Цитата(al_tele @ Aug 26 2009, 21:01)  ...Тогда как объявить что бы не жрать оперативку???? Можно вот так: Код __flash char Mess[10][64] = { "11111111111111111111111111111111111111111111111111111111\r", . . . . "999999999999999999999999999999999999999999999999999999999\r" }; Правда, все строки будут одинаковой длины.
--------------------
|
|
|
|
|
Aug 26 2009, 14:14
|
Группа: Участник
Сообщений: 5
Регистрация: 26-08-09
Пользователь №: 52 052

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

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 26 2009, 19:36
|
Профессионал
    
Группа: Свой
Сообщений: 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); } надеюсь, сам порядок размещения модификаторов не попутал  Ну и тут strlen должен уметь считать строки во flash (или принимать __generic). Двигать указателями в AVR, конечно, не так быстро, как в ARM, но и не всегда спешить надо
--------------------
aka Vit
|
|
|
|
|
Aug 27 2009, 05:37
|

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

|
Цитата(defunct @ Aug 27 2009, 02:26)  Предлагается найти 10 отличий?  Отличия достаточно одного, и находится оно находится ровно одной строчкой ниже отцитированного Вами. Найдите его: Код char __flash * __flash Mess[10] = { msg0, .... Код char __flash * __flash Mess[10] = { "11111111111111111111111111111\r", .....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 28 2009, 08:48
|
Группа: Участник
Сообщений: 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 не программировал никогда - заставили).
|
|
|
|
|
Aug 28 2009, 09:27
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(al_tele @ Aug 28 2009, 11:48)  ... почему то я знаю кто-бы утерся...  Как говорит мой друг: "Прогрес не затронул лишь человеческие взаимоотношения. И спустя тысячу лет - всё тоже. Любовь, ненависть, самоуверенность, измена, предательство... "Себя считали кем-то из немногих...". С другой стороны, я вот думаю, именно самоуверенность и гордость двигает прогресс вперёт. Без этих качеств была бы шляпа. Жаль что с годами они как-то уходят потиху, испаряются...
|
|
|
|
|
Sep 2 2009, 05:30
|
Группа: Участник
Сообщений: 5
Регистрация: 26-08-09
Пользователь №: 52 052

|
Цитата(SasaVitebsk @ Aug 28 2009, 13:27)   Как говорит мой друг: "Прогрес не затронул лишь человеческие взаимоотношения. И спустя тысячу лет - всё тоже. Любовь, ненависть, самоуверенность, измена, предательство... "Себя считали кем-то из немногих...". С другой стороны, я вот думаю, именно самоуверенность и гордость двигает прогресс вперёт. Без этих качеств была бы шляпа. Жаль что с годами они как-то уходят потиху, испаряются...  ну самоуверенность и гордость - это одно, а выпендриваться это другое - тем более как показывает мой жизненный опыт - это как правило на пустом месте. Если мне в работе не приходилось работать на МК с гарвардской архитектурой(а тут сразу появляются тонкости с указателями) - это не означает что можно умничать - знаешь - ну подскажи - не хочешь - промолчи. Но хамить не надо. Я очень люблю еще одно выражение - "где же твои деньги - раз ты такой умный".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|