Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инициализация EEPROM в IAR EWAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
garlands
собственно, в названии вопрос и отражен: как в EWAVR на этапе проекта инициализировать содержимое eeprom. Например, для mega16.
Сергей Борщ
Точно так же, как и любую другую переменную.
Код
typedef struct
{
   uint8_t data_a;
   uint32_t data_b;
} MyConfig_t;
__eeprom MyConfig_t Config =
{
   0x12,
   0x34567890
};
VladimirYU
Цитата(Сергей Борщ @ Jun 2 2008, 04:12) *
Точно так же, как и любую другую переменную.
Код
typedef struct
{
   uint8_t data_a;
   uint32_t data_b;
} MyConfig_t;
__eeprom MyConfig_t Config =
{
   0x12,
   0x34567890
};


И еще чуть чуть:
В настройках проекта Linker->Extra Options птицу в окошко Use command line options
а в окно примерно такиу две строчки

-y(CODE)
-Ointel-extended,(XDATA)=$EXE_DIR$\$PROJ_FNAME$_data.hex

И тогда получите прошивку HEX для ЕЕПРОМ.
garlands
Благодарю.
alux
Можно и так
Код
-y(CODE)
-Ointel-extended,(XDATA)=.eep
_Rookie_
Добавил в Linker->Extra options
-y(CODE)
-Ointel-extended,(XDATA)=$EXE_DIR$\$PROJ_FNAME$.eep

Сам код инициализации
__eeprom unsigned char erm[15]="Demo STRing";
или так
__eeprom char erm1=0x55;

Компилится нормально, но файл *.ерр фактически пустой, и не меняется, даже если я выкину строку инициализации из кода.
содержимое файла epp ниже. В чем может быть проблема?
:040000031000F000F9
:00000001FF

VladimirYU
Цитата(_Rookie_ @ Feb 21 2011, 23:38) *
Добавил в Linker->Extra options
-y(CODE)
-Ointel-extended,(XDATA)=$EXE_DIR$\$PROJ_FNAME$.eep

Сам код инициализации
__eeprom unsigned char erm[15]="Demo STRing";
или так
__eeprom char erm1=0x55;

Компилится нормально, но файл *.ерр фактически пустой, и не меняется, даже если я выкину строку инициализации из кода.
содержимое файла epp ниже. В чем может быть проблема?
:040000031000F000F9
:00000001FF


при объявлении переменных ЕЕПРОМ добавьте ключевое слово
__root __eeprom unsigned char erm[15]="Demo STRing";
в вашем случае скорей всего их выкинул компилятор, м.б. вы их не используете?
Roger
чтобы не создавать схожу тему, спрошу тут.
Задача построить список(дерево), поэтому требуется указатель на такой же объект.
есть класс(структура)
Код
Class MyClass
{
pulbic:
int a,b;
MyClass *prt;
}


как правильно написать чтобы
указатель
Код
MyClass *prt;
располагался во Flash
Такая конструкция не работает.
Код
__flash MyClass *prt;
Сергей Борщ
Ответ на ваш вопрос - "никак". Объект не может находиться частично в ОЗУ а частично во флеш.
Roger
Цитата(Сергей Борщ @ Mar 3 2011, 13:24) *
Ответ на ваш вопрос - "никак". Объект не может находиться частично в ОЗУ а
частично во флеш.

А как его полность разместить во флешь?
Код
__flash Сlass MyClass
{
pulbic:
int a,b;
MyClass *prt;
}

так описать класс?


тогда как правильно реализовать такую конструкцию:
Код
Class MyClass
{
pulbic:
int a,b;
MyClass *prt;
}
...

__flash MyClass m={0,1};
__flash MyClass t={2,3,&m};


Компилятор тоже ругается.
Сергей Борщ
Полагаю, что так:
CODE
Class MyClass
{
pulbic:
int a,b;
__flash MyClass *prt;
}
...

__flash MyClass m={0,1};
__flash MyClass t={2,3,&m};

Roger
Цитата(Сергей Борщ @ Mar 3 2011, 14:23) *
Полагаю, что так:
Код
Class MyClass
{
pulbic:
int a,b;
__flash MyClass *prt;
}
...

__flash MyClass m={0,1};
__flash MyClass t={2,3,&m};

Подобную конструкцию побывал, но компилятор ругался...

Код
__flash MyClass *prt;

Error[Pa004]: illegal declaration
prottoss
Цитата(Roger @ Mar 3 2011, 20:03) *
Подобную конструкцию побывал, но компилятор ругался...

Для __flash
Код
typedef class __MyClass
{    
    public:
      int a, b, c;
    __MyClass __flash *prt;
    
} MyClass, *p_MyClass;

__flash MyClass foo_a = { 1, 2, 3, 0 };
__flash MyClass foo_b = { 1, 2, 3, &foo_a};

int main()
{    
      int i, x = 0;
    
    for(i = 0; i < 10; i++)
    {
          x += foo_a.a;
        x -= foo_b.b;
        x ^= foo_a.c;
    }
      
      return x;
}

Для __eeprom парктически тоже
Код
typedef class __MyClass
{    
    public:
      int a, b, c;
    __MyClass __eeprom *prt;
    
} MyClass, *p_MyClass;

__eeprom MyClass foo_a = { 1, 2, 3, 0 };
__flash MyClass foo_b = { 1, 2, 3, &foo_a};
Roger
Если в класс добавить метод и к нему обращаться то возникают проблемы
Код
typedef class __MyClass
{    
    public:
      int a, b, c;
    __MyClass __flash *prt;
    void Add()
    {
        //a=b+c;
    }
    
} MyClass, *p_MyClass;

__flash MyClass foo_a = { 1, 2, 3, 0 };
MyClass __flash* prt=&foo_a; //создали указатель в OЗУ на объект во flash

void main()
{

prt->Add(); а тут траблы
Error[Pe315]: the object has cv-qualifiers that are not compatible with the member function    
            object type is: MyClass __flash
при обращении к полям класса проблем нету, а к методам есть

и тоже самое если вызвать метод у объекта
foo_a.Add();
}

Кто может подсказать в чем проблемы?
Сергей Борщ
Думаю, __flash подразумевает const. Вы пытаетесь вызвать функцию, которая изменяет объект. А объект константный. Если хотите уверить компилятор, что функция не изменяет объект, обявите ее с квалификатором const:
CODE
    void Add() const
    {
        //a=b+c;
    }
но тогда в ней нельзя будет делать a=
Roger
попробую

через 2 минуты
тот же результат sad.gif
Alex_1811
Вопрос чуток не по теме.
Как объявить переменную eeprom как глобальную переменную.
extern __eeprom __no_init unsigned char e_hit не фурычит.
desh
В одном .С файле объявляете без extern, а во всех остальных и заголовочных так как написали.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.