|
|
  |
генерация EEPROM в EWAVR 4.20a, дает "пустышку" |
|
|
|
Sep 7 2006, 20:02
|

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

|
Пару дней назад сел за этот компилятор и сразу появились грабли. При использовании ключей Код -Ointel-extended,(CODE)=.hex -Ointel-extended,(XDATA)=.eep по первой строке все нормально создается. По второй он создает файл нужного стандарта, но он пустой. точнее при любых начальных инициализациях EEPROM он вида Код :0400000300000000F9 :00000001FF Пробовал на разных настройках в том числе на "чистых" - т.е. Factory Settings архив проекта. я понимаю что тема не нова. вполне возможно это конкретно мой глюк или моей среды (не крякнута).
Сообщение отредактировал Аристарх - Sep 7 2006, 20:03
--------------------
|
|
|
|
|
Sep 7 2006, 21:22
|

Группа: Новичок
Сообщений: 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 она не линкуется?
--------------------
|
|
|
|
|
Sep 7 2006, 21:42
|

Гуру
     
Группа: Модераторы
Сообщений: 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 она не линкуется?  Нет, до момента когда это содержимое eeprom хоть на что-нибудь сгодится.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 8 2006, 07:53
|

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

|
Цитата(Сергей Борщ @ Sep 8 2006, 00:42)  Нет, до момента когда это содержимое eeprom хоть на что-нибудь сгодится. Добавлю от себя. Процитированное утверждение относится к КАЖДОМУ обьекту, обьявленному в еепром. Т. е. нельзя утверждать, что если одна переменная из еепром оказалась востребованной, то и всё остальное будет включено в выходной файл, будет включено только то, что востребовано в коде программы. Тем не менее, чрезмерное увлечение __root может привести к побочным эффектам: 1 - появление мусора в еепром; 2 - ложную уверенность в том, что эти обьекты в коде используются. Чтобы проверить, используется ли некий обьект в коде, попробуйте поискать его в файле *.map, генерируемом линкером (в настройках необходимо заставить его это делать).
|
|
|
|
|
Sep 8 2006, 16:36
|

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

|
Компилятор не то чтобы слишком умный, но я переехал с CVAVR, а у него видимо девиз- "программист всегда прав". следующий кусок преспокойно окажется в EEPROM Код #include <mega8.h> eeprom char ST[] = "TEST"; void main(void) {} Проблема заключается в том, что компилятор не генерирует начальное значение EEPROM при случае только чтения из него, а только в случае записи. Спасибо за совет про __root - не знал об этом. Но все же ИМХО такой подход компилятора не есть гуд.
--------------------
|
|
|
|
|
Sep 8 2006, 18:27
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Sep 16 2006, 11:54
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Цитата(Аристарх @ Sep 8 2006, 00:02)  Пару дней назад сел за этот компилятор и сразу появились грабли. При использовании ключей Код -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 - Sep 16 2006, 11:58
|
|
|
|
|
Oct 26 2006, 10:18
|
Местный
  
Группа: Свой
Сообщений: 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 надо делать, почему бы не совместить это с инициализацией.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|