Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
LoLo
Доброго времени суток, всем! Взялся разбираться с AVR на AVRStudio.
Проблема такая. Необходимо матрицу 800 элементов (контстанты)
объявить в памяти программ, чтобы они не занимали места в ОЗУ!
Все перепробовал - бесполезно. После компиляции все 800 штук
указаны в DATA. Объявляю как const - тоже самое!!! Хотя в книгах пишут,
что если объявлено как const, то должны храниться в памяти программ.
Что делать?
Сергей Борщ
AVRStudio - оболочка/симулятор. В комплекте с ней идет ассемблер AVRasm (AVRasm2). Упоминание компиляции наталкивает на мысль, что в качестве компилятора вы используете avr-gcc (WinAVR).
Цитата(LoLo @ Dec 22 2008, 13:26) *
Хотя в книгах пишут, что если объявлено как const, то должны храниться в памяти программ.
Выкинуть такие книги. const означает, что компилятор не позволит изменить это, т.е. данные с атрибутом const являются read-only. Куда размещать такие данные - отдано на усмотрение компилятору.
Цитата(LoLo @ Dec 22 2008, 13:26) *
Что делать?
Как всегда - читать документацию. Начать с Winavr/doc/avr-libc/faq.html. Читать от начала до конца, обратить внимание на атрибут PROGMEM.
mempfis_
Цитата(LoLo @ Dec 22 2008, 15:26) *
Доброго времени суток, всем! Взялся разбираться с AVR на AVRStudio.
Проблема такая. Необходимо матрицу 800 элементов (контстанты)
объявить в памяти программ, чтобы они не занимали места в ОЗУ!
Все перепробовал - бесполезно. После компиляции все 800 штук
указаны в DATA. Объявляю как const - тоже самое!!! Хотя в книгах пишут,
что если объявлено как const, то должны храниться в памяти программ.
Что делать?


Давно писал на ассемблере но кажется надо делать так:

.CSEG
loop:
.DB 10, 151, 898

p.s. сорри не дочитал до конца и подумал что речь идёт об ассемблере
в С нужно использовать ключевое слово:
__flash char var[800] // для iar
flash char var[800] //для cvavr
для других компиляторов не знаю smile.gif
777777
Цитата(Сергей Борщ @ Dec 22 2008, 14:46) *
Выкинуть такие книги.

Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти, поэтому приходится пользоваться не только такими извращениями как PROGMEM, но и pgm_read_word_near и т.п., вместо того чтобы просто разыменовывать указатель, а компилятор по его типу догадывался бы, в какую память обращаться.
LoLo
Цитата(Сергей Борщ @ Dec 22 2008, 14:46) *
AVRStudio - оболочка/симулятор. В комплекте с ней идет ассемблер AVRasm (AVRasm2). Упоминание компиляции наталкивает на мысль, что в качестве компилятора вы используете avr-gcc (WinAVR).Выкинуть такие книги. const означает, что компилятор не позволит изменить это, т.е. данные с атрибутом const являются read-only. Куда размещать такие данные - отдано на усмотрение компилятору.
Как всегда - читать документацию. Начать с Winavr/doc/avr-libc/faq.html. Читать от начала до конца, обратить внимание на атрибут PROGMEM.


Спасибо. Память данных уменьшилась. Но появились warning: initialization makes pointer from integer without a cast. Очень много...

Цитата(mempfis_ @ Dec 22 2008, 14:56) *
Давно писал на ассемблере но кажется надо делать так:

.CSEG
loop:
.DB 10, 151, 898

p.s. сорри не дочитал до конца и подумал что речь идёт об ассемблере
в С нужно использовать ключевое слово:
__flash char var[800] // для iar
flash char var[800] //для cvavr
для других компиляторов не знаю smile.gif


Надо для WinAVR
Daskar
Цитата(LoLo @ Dec 22 2008, 16:24) *
Спасибо. Память данных уменьшилась. Но появились warning: initialization makes pointer from integer without a cast. Очень много...
Надо для WinAVR

В WinAVR попробуйте сделать примерно так:
uint8_t Data[800]PROGMEM = {0x81, 0x42, 0x24, 0x18, ....};
defunct
Цитата(777777 @ Dec 22 2008, 14:01) *
Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти

В продолжение - а IAR что лучше?
С какого бодуна строковые литералы format string'a для printf, которые всегда CONST, размещаются в RAM?
demiurg_spb
Цитата(777777 @ Dec 22 2008, 15:01) *
Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти, поэтому приходится пользоваться не только такими извращениями как PROGMEM, но и pgm_read_word_near и т.п., вместо того чтобы просто разыменовывать указатель, а компилятор по его типу догадывался бы, в какую память обращаться.
Любой стандартный компилятор C создаёт код из предположения что у нас одно адресное пространство (Архитектура фон Неймана), ну а если это не так (у AVR гарвардская архитектура + ещё eeprom) приходится так или иначе указывать в какой памяти располагать те или иные данные. И это не извращения, а необходимость. А платформ где нет программной памяти не существует, т.к. программа есть всегда и она гдето располагается пусть даже в виде отверстий в перфокартеsmile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.