[an error occurred while processing this directive]
по умолчанию она установлена. Попробуйте ее снять.
Если Вы действительно используете константы, то объявление
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