manwf 0 7 сентября, 2006 Опубликовано 7 сентября, 2006 (изменено) · Жалоба Пару дней назад сел за этот компилятор и сразу появились грабли. При использовании ключей -Ointel-extended,(CODE)=.hex -Ointel-extended,(XDATA)=.eep по первой строке все нормально создается. По второй он создает файл нужного стандарта, но он пустой. точнее при любых начальных инициализациях EEPROM он вида :0400000300000000F9 :00000001FF Пробовал на разных настройках в том числе на "чистых" - т.е. Factory Settings архив проекта. я понимаю что тема не нова. вполне возможно это конкретно мой глюк или моей среды (не крякнута). eeprom_test.rar Изменено 7 сентября, 2006 пользователем Аристарх Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
manwf 0 7 сентября, 2006 Опубликовано 7 сентября, 2006 · Жалоба В принципе решил проблему, но есть еще один момент. вот этот кусок кода не сгенерит .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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 7 сентября, 2006 Опубликовано 7 сентября, 2006 · Жалоба Пару дней назад сел за этот компилятор и сразу появились грабли.Слишком умный компилятор :-) Выкинул все лишнее нафиг. __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 хоть на что-нибудь сгодится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 8 сентября, 2006 Опубликовано 8 сентября, 2006 · Жалоба Нет, до момента когда это содержимое eeprom хоть на что-нибудь сгодится. Добавлю от себя. Процитированное утверждение относится к КАЖДОМУ обьекту, обьявленному в еепром. Т. е. нельзя утверждать, что если одна переменная из еепром оказалась востребованной, то и всё остальное будет включено в выходной файл, будет включено только то, что востребовано в коде программы. Тем не менее, чрезмерное увлечение __root может привести к побочным эффектам: 1 - появление мусора в еепром; 2 - ложную уверенность в том, что эти обьекты в коде используются. Чтобы проверить, используется ли некий обьект в коде, попробуйте поискать его в файле *.map, генерируемом линкером (в настройках необходимо заставить его это делать). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
manwf 0 8 сентября, 2006 Опубликовано 8 сентября, 2006 · Жалоба Компилятор не то чтобы слишком умный, но я переехал с CVAVR, а у него видимо девиз- "программист всегда прав". следующий кусок преспокойно окажется в EEPROM #include <mega8.h> eeprom char ST[] = "TEST"; void main(void) {} Проблема заключается в том, что компилятор не генерирует начальное значение EEPROM при случае только чтения из него, а только в случае записи. Спасибо за совет про __root - не знал об этом. Но все же ИМХО такой подход компилятора не есть гуд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 8 сентября, 2006 Опубликовано 8 сентября, 2006 · Жалоба Компилятор не то чтобы слишком умный, но я переехал с 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, т.к. значение глобальной переменной с может быть использовано в других файлах проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chernenko 0 16 сентября, 2006 Опубликовано 16 сентября, 2006 (изменено) · Жалоба Пару дней назад сел за этот компилятор и сразу появились грабли. При использовании ключей -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 Изменено 16 сентября, 2006 пользователем chernenko Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 16 сентября, 2006 Опубликовано 16 сентября, 2006 · Жалоба chernenko, подробно об этом здесь, ибо код ошибки, сгенерированной линкером в Вашем случае указывает именно на то, что Вы имеете несколько пространств памяти eeprom, flash, ... в Вашем проекте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 26 октября, 2006 Опубликовано 26 октября, 2006 · Жалоба Я уже давно делаю так: __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 надо делать, почему бы не совместить это с инициализацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться