Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация данных в eeprom
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
mempfis_
Добрый день.
Стоит задача сохранить в eeprom несколько байт данных. Сохраняю по 3 набора данных и пытаюсь отделить их друг от друга разделительной областью:

Код
__eeprom unsigned char var1;
__eeprom unsigned char area1[32];

__eeprom unsigned char var2;
__eeprom unsigned char area2[32];

__eeprom unsigned char var3;
__eeprom unsigned char area3[32];


Компилятор упорно оптимизирует эти разделительные области т.к. я к ним не обращаюсь.
Приходится вводить фиктивное обращение к ним чтобы обмануть компилятор.
Подскажите пожалуйста как явно указать компилятору чтобы он не оптимизировал эти области.
Пробовал использовать __require(area1) выдаёт следующие ошибки:

Код
Error[Pe147]: declaration is incompatible with "void __require(void *)" (declared at line 57 of "C:\Program Files\IAR Systems\IAR AVR\ D:\projects\Kotel\IAR\eeprom.h 36
Error[Pe144]: a value of type "unsigned char __eeprom *" cannot be used to initialize an entity of type "int" D:\projects\Kotel\IAR\eeprom.h 36


Подскажите как в IARe решается эта проблема.
Rst7
Kлючевое слово __root. Или, что лучше, создать неименованную структуру, примерно так:

Код
struct
{
__eeprom unsigned char var1;
__eeprom unsigned char area1[32];

__eeprom unsigned char var2;
__eeprom unsigned char area2[32];

__eeprom unsigned char var3;
__eeprom unsigned char area3[32];
}
mempfis_
Цитата
Kлючевое слово __root. Или, что лучше, создать неименованную структуру, примерно так:


Спасибо за подсказку.
Попутно вопрос если применить __root с __no_init то как линкер разместит переменные?
Я вижу что файл для eeprom тает с применением __no_init но будут-ли мои переменные расположенны именно там где нужно (т.е. останется между ними интервал) или компилятор оптимизирует и расположит их все вместе?
sergik_vrn
Цитата(mempfis_ @ Jan 20 2009, 16:17) *
Спасибо за подсказку.
Попутно вопрос если применить __root с __no_init то как линкер разместит переменные?
Я вижу что файл для eeprom тает с применением __no_init но будут-ли мои переменные расположенны именно там где нужно (т.е. останется между ними интервал) или компилятор оптимизирует и расположит их все вместе?

это зависит от того, разрешена ли соответствующая опция оптимизации. по опыту скажу, что лучше (и правильнее) использовать структуру, там расположение полей будет гарантировано в любом случае. при необходимости, вопросы выравнивания решаются применением #pragma align
mempfis_
Уговорили - вместо переменных использовал структуру smile.gif
Надеюсь компилятор не посмеет оптимизировать разделительные поля структуры и не изменит порядок их размещения smile.gif
Всем спасибо за подсказки smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.