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

Помогите разобраться

Доброго времени суток, всем! Взялся разбираться с AVR на AVRStudio.

Проблема такая. Необходимо матрицу 800 элементов (контстанты)

объявить в памяти программ, чтобы они не занимали места в ОЗУ!

Все перепробовал - бесполезно. После компиляции все 800 штук

указаны в DATA. Объявляю как const - тоже самое!!! Хотя в книгах пишут,

что если объявлено как const, то должны храниться в памяти программ.

Что делать?

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


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

AVRStudio - оболочка/симулятор. В комплекте с ней идет ассемблер AVRasm (AVRasm2). Упоминание компиляции наталкивает на мысль, что в качестве компилятора вы используете avr-gcc (WinAVR).

Хотя в книгах пишут, что если объявлено как const, то должны храниться в памяти программ.
Выкинуть такие книги. const означает, что компилятор не позволит изменить это, т.е. данные с атрибутом const являются read-only. Куда размещать такие данные - отдано на усмотрение компилятору.

Что делать?
Как всегда - читать документацию. Начать с Winavr/doc/avr-libc/faq.html. Читать от начала до конца, обратить внимание на атрибут PROGMEM.

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


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

Доброго времени суток, всем! Взялся разбираться с 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

для других компиляторов не знаю :)

Изменено пользователем mempfis_

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


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

Выкинуть такие книги.

Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти, поэтому приходится пользоваться не только такими извращениями как PROGMEM, но и pgm_read_word_near и т.п., вместо того чтобы просто разыменовывать указатель, а компилятор по его типу догадывался бы, в какую память обращаться.

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


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

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. Очень много...

 

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

 

.CSEG

loop:

.DB 10, 151, 898

 

p.s. сорри не дочитал до конца и подумал что речь идёт об ассемблере

в С нужно использовать ключевое слово:

__flash char var[800] // для iar

flash char var[800] //для cvavr

для других компиляторов не знаю :)

 

Надо для WinAVR

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


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

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

Надо для WinAVR

В WinAVR попробуйте сделать примерно так:

uint8_t Data[800]PROGMEM = {0x81, 0x42, 0x24, 0x18, ....};

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


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

Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти

В продолжение - а IAR что лучше?

С какого бодуна строковые литералы format string'a для printf, которые всегда CONST, размещаются в RAM?

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


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

Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти, поэтому приходится пользоваться не только такими извращениями как PROGMEM, но и pgm_read_word_near и т.п., вместо того чтобы просто разыменовывать указатель, а компилятор по его типу догадывался бы, в какую память обращаться.
Любой стандартный компилятор C создаёт код из предположения что у нас одно адресное пространство (Архитектура фон Неймана), ну а если это не так (у AVR гарвардская архитектура + ещё eeprom) приходится так или иначе указывать в какой памяти располагать те или иные данные. И это не извращения, а необходимость. А платформ где нет программной памяти не существует, т.к. программа есть всегда и она гдето располагается пусть даже в виде отверстий в перфокарте:)

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


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

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

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

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

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

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

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

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

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

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