|
Инициализация EEPROM в IAR EWAVR |
|
|
|
Jun 3 2008, 05:50
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(Сергей Борщ @ 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 для ЕЕПРОМ.
|
|
|
|
|
Jun 5 2008, 12:22
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Можно и так Код -y(CODE) -Ointel-extended,(XDATA)=.eep
|
|
|
|
|
Feb 21 2011, 20:38
|
Группа: Новичок
Сообщений: 4
Регистрация: 14-04-06
Пользователь №: 16 102

|
Добавил в 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
|
|
|
|
|
Feb 22 2011, 10:54
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(_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"; в вашем случае скорей всего их выкинул компилятор, м.б. вы их не используете?
|
|
|
|
|
Mar 3 2011, 10:10
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
чтобы не создавать схожу тему, спрошу тут. Задача построить список(дерево), поэтому требуется указатель на такой же объект. есть класс(структура) Код Class MyClass { pulbic: int a,b; MyClass *prt; } как правильно написать чтобы указатель Код MyClass *prt; располагался во Flash Такая конструкция не работает. Код __flash MyClass *prt;
Сообщение отредактировал Roger - Mar 3 2011, 10:10
|
|
|
|
|
Mar 3 2011, 10:35
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Цитата(Сергей Борщ @ 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}; Компилятор тоже ругается.
Сообщение отредактировал Roger - Mar 3 2011, 10:46
|
|
|
|
|
Mar 3 2011, 12:03
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Цитата(Сергей Борщ @ 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
Сообщение отредактировал Roger - Mar 3 2011, 12:22
|
|
|
|
|
Mar 3 2011, 12:29
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(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};
--------------------
|
|
|
|
|
Mar 11 2011, 12:45
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Если в класс добавить метод и к нему обращаться то возникают проблемы Код 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(); } Кто может подсказать в чем проблемы?
|
|
|
|
|
Mar 11 2011, 13:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Думаю, __flash подразумевает const. Вы пытаетесь вызвать функцию, которая изменяет объект. А объект константный. Если хотите уверить компилятор, что функция не изменяет объект, обявите ее с квалификатором const: CODE void Add() const { //a=b+c; } но тогда в ней нельзя будет делать a=
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|