реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> генерация EEPROM в EWAVR 4.20a, дает "пустышку"
Аристарх
сообщение Sep 7 2006, 20:02
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 29-08-06
Пользователь №: 19 923



Пару дней назад сел за этот компилятор и сразу появились грабли.
При использовании ключей
Код
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

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

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

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

Сообщение отредактировал Аристарх - Sep 7 2006, 20:03
Прикрепленные файлы
Прикрепленный файл  eeprom_test.rar ( 18.62 килобайт ) Кол-во скачиваний: 62
 


--------------------
...Сейчас запустим - узнаем!
Go to the top of the page
 
+Quote Post
Аристарх
сообщение Sep 7 2006, 21:22
Сообщение #2





Группа: Новичок
Сообщений: 4
Регистрация: 29-08-06
Пользователь №: 19 923



В принципе решил проблему, но есть еще один момент.
вот этот кусок кода не сгенерит .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


--------------------
...Сейчас запустим - узнаем!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 7 2006, 21:42
Сообщение #3


Гуру
******

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



Цитата(Аристарх @ 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 хоть на что-нибудь сгодится.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 8 2006, 07:53
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Сергей Борщ @ Sep 8 2006, 00:42) *
Нет, до момента когда это содержимое eeprom хоть на что-нибудь сгодится.

Добавлю от себя.
Процитированное утверждение относится к КАЖДОМУ обьекту, обьявленному в еепром.
Т. е. нельзя утверждать, что если одна переменная из еепром оказалась востребованной, то и всё остальное будет включено в выходной файл, будет включено только то, что востребовано в коде программы.
Тем не менее, чрезмерное увлечение __root может привести к побочным эффектам:
1 - появление мусора в еепром;
2 - ложную уверенность в том, что эти обьекты в коде используются.
Чтобы проверить, используется ли некий обьект в коде, попробуйте поискать его в файле *.map, генерируемом линкером (в настройках необходимо заставить его это делать).
Go to the top of the page
 
+Quote Post
Аристарх
сообщение Sep 8 2006, 16:36
Сообщение #5





Группа: Новичок
Сообщений: 4
Регистрация: 29-08-06
Пользователь №: 19 923



Компилятор не то чтобы слишком умный, но я переехал с CVAVR, а у него видимо девиз- "программист всегда прав".
следующий кусок преспокойно окажется в EEPROM
Код
#include <mega8.h>
eeprom char ST[] = "TEST";
void main(void)
{}

Проблема заключается в том, что компилятор не генерирует начальное значение EEPROM при случае только чтения из него, а только в случае записи.
Спасибо за совет про __root - не знал об этом.
Но все же ИМХО такой подход компилятора не есть гуд.


--------------------
...Сейчас запустим - узнаем!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 8 2006, 18:27
Сообщение #6


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
chernenko
сообщение Sep 16 2006, 11:54
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116



Цитата(Аристарх @ 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

Сообщение отредактировал chernenko - Sep 16 2006, 11:58
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 16 2006, 12:40
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



chernenko, подробно об этом здесь, ибо код ошибки, сгенерированной линкером в Вашем случае указывает именно на то, что Вы имеете несколько пространств памяти eeprom, flash, ... в Вашем проекте.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Oct 26 2006, 10:18
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Я уже давно делаю так:
Код
__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 надо делать, почему бы не совместить это с инициализацией.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016