[an error occurred while processing this directive]
Ну, не все уж так и плохо. В Options-ICCAVR-Code есть галочка "Place string literals and constants in initialized PAM" (+) "
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Беня 28 февраля 2003 г. 14:34
В ответ на: Ответ: IAR один из самых глючных компиляторов. Все нормальные компиляторы, встречая const, записывают массив во flash (ПЗУ), а этот нифига. В старых версиях надо было писать flash const unsigned char tra-la-la, а в новой они сменили расширенный синтаксис (очень нехорошо поступили). В новой версии надо писать unsigned char __flash tra-la-la. Ещё и вектора прерываний по-другому надо инициализировать. отправлено ВВБ 28 февраля 2003 г. 13:30

по умолчанию она установлена. Попробуйте ее снять.


Если Вы действительно используете константы, то объявление
const int my_var = 5 ;
будет создавать действительно 2-байтовую переменную в ПЗУ, и если установлена галочка - то и в ОЗУ (чтобы все время в ПЗУ не лазить - это займет и время процессора и лишний код).
В таком случае разумно сделать
#define DEF1 5
при этом никакие переменные создаваться не будут, а константа учитывается при генерации кода.

Если Вам надо строки располагать только в ПЗУ, то надо объявлять :
__flash char string1 = "Hello!" ;
При этом строка будет в ПЗУ, и для работы с ней надо использовать функции с постфиксом _P - strcpy_P(), sprintf_P и т. д., для этого надо "инклюднуть" файл pgmspace.h
Это (другие функции) сделано потому, чтобы функция точно знала, куда указывает 2-байтовый указатель - на область ОЗУ или на ПЗУ. Функции с окончанием _P() "знают" , что их аргумент-указатель указывает на ПЗУ.
А если вы объявите
char string1 = "Hello!" ;
то компилятор обязан будет сделать копию в ОЗУ, чтобы Вы могли использовать обычный указатель (согласно стандарту языка Си), например :
char * ptr;
ptr = &string1[2] ;

А вот если Вы сделаете все в ПЗУ, то Вам надо :
__flash char string1 = "Hello!" ;
char __flash * ptr ;
ptr = & string1[ 2] ;
Поэтому копия в ОЗУ создается для совместимости со стандартом Си.

IAR пошла на это потому, что у нее указатели не универсальные 3-байтовые (которые могли бы указывать и на ПЗУ и на ОЗУ и содержали бы дополнительные поле типа памяти), а 2-байтовые. 2-байтовые указатели приводят к более быстрому и маленькому коду (не надо все время анализировать тип указателя и в зависимости от этого работать либо так либо эдак) и к экономии ОЗУ - не надо для переменной типа "указатель" лишний байт заводить.
Так что IAR для AVR очень хороший, только надо разобраться.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru