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

Инициализация EEPROM в IAR EWAVR

собственно, в названии вопрос и отражен: как в EWAVR на этапе проекта инициализировать содержимое eeprom. Например, для mega16.

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


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

Точно так же, как и любую другую переменную.

typedef struct
{
   uint8_t data_a;
   uint32_t data_b; 
} MyConfig_t;
__eeprom MyConfig_t Config = 
{
   0x12,
   0x34567890
};

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


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

Точно так же, как и любую другую переменную.
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 для ЕЕПРОМ.

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


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

Добавил в 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

 

 

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


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

Добавил в 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";

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

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


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

чтобы не создавать схожу тему, спрошу тут.

Задача построить список(дерево), поэтому требуется указатель на такой же объект.

есть класс(структура)

Class MyClass
{
pulbic:
int a,b;
MyClass *prt;
}

 

как правильно написать чтобы

указатель

MyClass *prt;

располагался во Flash

Такая конструкция не работает.

__flash MyClass *prt;

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

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


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

Ответ на ваш вопрос - "никак". Объект не может находиться частично в ОЗУ а частично во флеш.

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


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

Ответ на ваш вопрос - "никак". Объект не может находиться частично в ОЗУ а

частично во флеш.

А как его полность разместить во флешь?

__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};

 

Компилятор тоже ругается.

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

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


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

Полагаю, что так:

Class MyClass
{
pulbic:
int a,b;
__flash MyClass *prt;
}
...

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

 

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


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

Полагаю, что так:

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

 

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

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


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

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

Для __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};

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


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

Если в класс добавить метод и к нему обращаться то возникают проблемы

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:

    void Add() const
    {
        //a=b+c;
    }

но тогда в ней нельзя будет делать a=

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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