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

генерация EEPROM в EWAVR 4.20a

Пару дней назад сел за этот компилятор и сразу появились грабли.

При использовании ключей

-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

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

:0400000300000000F9
:00000001FF

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

 

архив проекта.

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

eeprom_test.rar

Изменено пользователем Аристарх

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


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

В принципе решил проблему, но есть еще один момент.

вот этот кусок кода не сгенерит .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:

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


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

Пару дней назад сел за этот компилятор и сразу появились грабли.
Слишком умный компилятор :-) Выкинул все лишнее нафиг.

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

 

 

получается что до момента явной записи в EEPROM она не линкуется? :cranky:
Нет, до момента когда это содержимое eeprom хоть на что-нибудь сгодится.

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


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

Нет, до момента когда это содержимое eeprom хоть на что-нибудь сгодится.

Добавлю от себя.

Процитированное утверждение относится к КАЖДОМУ обьекту, обьявленному в еепром.

Т. е. нельзя утверждать, что если одна переменная из еепром оказалась востребованной, то и всё остальное будет включено в выходной файл, будет включено только то, что востребовано в коде программы.

Тем не менее, чрезмерное увлечение __root может привести к побочным эффектам:

1 - появление мусора в еепром;

2 - ложную уверенность в том, что эти обьекты в коде используются.

Чтобы проверить, используется ли некий обьект в коде, попробуйте поискать его в файле *.map, генерируемом линкером (в настройках необходимо заставить его это делать).

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


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

Компилятор не то чтобы слишком умный, но я переехал с CVAVR, а у него видимо девиз- "программист всегда прав".

следующий кусок преспокойно окажется в EEPROM

#include <mega8.h>
eeprom char ST[] = "TEST";
void main(void)
{}

Проблема заключается в том, что компилятор не генерирует начальное значение EEPROM при случае только чтения из него, а только в случае записи.

Спасибо за совет про __root - не знал об этом.

Но все же ИМХО такой подход компилятора не есть гуд.

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


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

Компилятор не то чтобы слишком умный, но я переехал с CVAVR, а у него видимо девиз- "программист всегда прав".
У ИАРа девиз "должно работать как задумал программист и чтодбы при этом ничего лишнего".

Проблема заключается в том, что компилятор не генерирует начальное значение 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, т.к. значение глобальной переменной с может быть использовано в других файлах проекта.

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


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

Пару дней назад сел за этот компилятор и сразу появились грабли.

При использовании ключей

-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

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

:0400000300000000F9
:00000001FF

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

 

архив проекта.

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

 

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

 

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

 

Error[e133]: The output format intel-extended cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted

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

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


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

chernenko, подробно об этом здесь, ибо код ошибки, сгенерированной линкером в Вашем случае указывает именно на то, что Вы имеете несколько пространств памяти eeprom, flash, ... в Вашем проекте.

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


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

Я уже давно делаю так:

__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 надо делать, почему бы не совместить это с инициализацией.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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