Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: генерация EEPROM в EWAVR 4.20a
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Аристарх
Пару дней назад сел за этот компилятор и сразу появились грабли.
При использовании ключей
Код
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

по первой строке все нормально создается. По второй он создает файл нужного стандарта, но он пустой. точнее при любых начальных инициализациях EEPROM он вида
Код
:0400000300000000F9
:00000001FF

Пробовал на разных настройках в том числе на "чистых" - т.е. Factory Settings

архив проекта.
я понимаю что тема не нова. вполне возможно это конкретно мой глюк или моей среды (не крякнута).
Аристарх
В принципе решил проблему, но есть еще один момент.
вот этот кусок кода не сгенерит .eep
Код
__eeprom char ST[] = "TEST EEPTOM";
int main( void )
{
  char i;
  i = ST[1];
  return 0;
}

А вот этот - сгенерирует по полной программе
Код
__eeprom char ST[] = "TEST EEPTOM";
int main( void )
{
  char i;
  i = ST[1];
  ST[3] = i;
  return 0;
}


получается что до момента явной записи в EEPROM она не линкуется? cranky.gif
Сергей Борщ
Цитата(Аристарх @ Sep 7 2006, 23:02) *
Пару дней назад сел за этот компилятор и сразу появились грабли.
Слишком умный компилятор :-) Выкинул все лишнее нафиг.
Цитата
__eeprom char ST[] = "TEST EEPTOM";
__eeprom char eee = 245;
int main( void )
{
char i;
i = ST[1];
i += 1;
return 0;
}

Ни одна из этих переменных в проекте не используется, значит не нужна.
Цитата
__eeprom char ST[] = "TEST EEPTOM";
__eeprom char eee = 245;
int main( void )
{
char i;
i = ST[1];
i += 1;
return i;
}
Дает совсем другой результат.

Или на крайний случай (не используется, но очень надо иметь в выходном файле):
Код
__root __eeprom char ST[] = "TEST EEPTOM";
__root __eeprom char eee = 245;



Цитата(Аристарх @ Sep 8 2006, 00:22) *
получается что до момента явной записи в EEPROM она не линкуется? cranky.gif
Нет, до момента когда это содержимое eeprom хоть на что-нибудь сгодится.
IgorKossak
Цитата(Сергей Борщ @ Sep 8 2006, 00:42) *
Нет, до момента когда это содержимое eeprom хоть на что-нибудь сгодится.

Добавлю от себя.
Процитированное утверждение относится к КАЖДОМУ обьекту, обьявленному в еепром.
Т. е. нельзя утверждать, что если одна переменная из еепром оказалась востребованной, то и всё остальное будет включено в выходной файл, будет включено только то, что востребовано в коде программы.
Тем не менее, чрезмерное увлечение __root может привести к побочным эффектам:
1 - появление мусора в еепром;
2 - ложную уверенность в том, что эти обьекты в коде используются.
Чтобы проверить, используется ли некий обьект в коде, попробуйте поискать его в файле *.map, генерируемом линкером (в настройках необходимо заставить его это делать).
Аристарх
Компилятор не то чтобы слишком умный, но я переехал с CVAVR, а у него видимо девиз- "программист всегда прав".
следующий кусок преспокойно окажется в EEPROM
Код
#include <mega8.h>
eeprom char ST[] = "TEST";
void main(void)
{}

Проблема заключается в том, что компилятор не генерирует начальное значение EEPROM при случае только чтения из него, а только в случае записи.
Спасибо за совет про __root - не знал об этом.
Но все же ИМХО такой подход компилятора не есть гуд.
Сергей Борщ
Цитата(Аристарх @ Sep 8 2006, 19:36) *
Компилятор не то чтобы слишком умный, но я переехал с CVAVR, а у него видимо девиз- "программист всегда прав".
У ИАРа девиз "должно работать как задумал программист и чтодбы при этом ничего лишнего".
Цитата(Аристарх @ Sep 8 2006, 19:36) *
Проблема заключается в том, что компилятор не генерирует начальное значение EEPROM при случае только чтения из него, а только в случае записи.
Нет, тут вы не правы - смотрите мой пример:
Код
int main( void )
{
char i;
i = ST[1];
i += 1;
return i;
}
В этом случае начальное значение ST будет помещено в прошивку - поскольку значение ST[1] дальше используется, а не просто читается во временную переменную которая тут же будет уничтожена т.к. не понадобилась.
даже простой вариант
Код
char c;
int main( void )
{
c = ST[1];
return 0;
}
тоже вызовет генерацию ST в eeprom, т.к. значение глобальной переменной с может быть использовано в других файлах проекта.
chernenko
Цитата(Аристарх @ Sep 8 2006, 00:02) *
Пару дней назад сел за этот компилятор и сразу появились грабли.
При использовании ключей
Код
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

по первой строке все нормально создается. По второй он создает файл нужного стандарта, но он пустой. точнее при любых начальных инициализациях EEPROM он вида
Код
:0400000300000000F9
:00000001FF

Пробовал на разных настройках в том числе на "чистых" - т.е. Factory Settings

архив проекта.
я понимаю что тема не нова. вполне возможно это конкретно мой глюк или моей среды (не крякнута).


Как вы решили эту проблему? У меня точно такая же ситуация, как исправить не знаю sad.gif

И при компиляции получаю ошибку

Error[e133]: The output format intel-extended cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted
IgorKossak
chernenko, подробно об этом здесь, ибо код ошибки, сгенерированной линкером в Вашем случае указывает именно на то, что Вы имеете несколько пространств памяти eeprom, flash, ... в Вашем проекте.
VladislavS
Я уже давно делаю так:
Код
__no_init __eeprom unsigned char ee_flag;
__no_init __eeprom unsigned char a;
__no_init __eeprom unsigned int b;

int main()
{
  if(ee_flag==0xFF)
  {
    ee_flag=0;
    a=0;
    b=1000;
  }
  // Остальной код
}


В качестве флага можно использовать одну из полезных из переменных, если у неё FF недопустимое значение. Это дает много плюсов. Во-первых, компилятор не генерит сегмент ee_prom и не надо думать как его вынести в другой файл. Во-вторых, не надо отдельно прошивать EEPROM и каждый раз ловить регулировщиков на том что они его не прошили. В-третьих, все равно контроль корректности данных в EEPROM надо делать, почему бы не совместить это с инициализацией.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.