Пр! А может кто-нибудь пояснить отличие 20090313 от 20100110, в частности по работе с eeprom?
Собсно, чего спрашиваю: столкнулся с непонятками. Делаю проект в Code::Blocks, довольно давно (собственного makefile нет, настройки компилятора и линкера - рабочие; mega8535, winavr-20100110). Почти все готово, но понадобилось поработать с eeprom. Не вопрос, #include <avr/eeprom.h> и далее по мануалу. Но не тут-то было.
Код: Выделить всё
eeprom_read_block( (void*)&set_value, (void*)2, SCHED_STORE_LENGTH);
for( i=0; i<SCHED_STORE_LENGTH; i++ ){
set_value[i]=eeprom_read_byte((void*)2+i);
}
if( eeprom_is_ready() ) i++;
Поясню: сначала я безмятежно вызвал в коде eeprom_read_block, линкер ругнулся
obj\Debug\main.o||In function `main':|
D:\HPMon\main.c|470|undefined reference to `__eerd_block_m8535'|
Хм, ну ладно. Убрал вызов eeprom_read_block, заменил его циклом, в котором читаю по байтам. Все хорошо, компилится. Т.к. проц уже под завязку, откладываю работу с eeprom и иду шерстить внешние библиотеки, выкидывать из них ненужные функции и сокращать возможности. Спустя какое-то время ковыряния во внешних библиотеках проект опять перестает компилиться:
obj\Debug\main.o||In function `main':|
D:\HPMon\main.c|473|undefined reference to `__eerd_byte_m8535'|
Что за? Убираю вызов eeprom_read_byte, добавляю вызов eeprom_is_ready просто для того чтобы убедиться в работоспособности библиотеки - нормально. Возвращаю назад вызов eeprom_read_* - ошибки. Переставляю winavr - ошибки. Гуглю - ноль результатов (проблема у человека на avrfreaks - не в счет, там косяк visual studio был). Параллельно установил winavr-20090313, подменил его вместо 20100110 - о, проект скомпилился без ошибок. Проверил, вернул назад 20100110 - ошибки. Правда, в железе пока не проверял, код для eeprom, кроме этих двух тестовых вызовов eeprom_read_*, я еще не писал.
В чем прикол такого поведения? Ведь нареканий на avr-libc не было, в проекте куча работающих include типа delay, io, pgmspace, interrupt... Неужели потребовался год разработки avr-libc, чтобы добавить косяков в функции eeprom? Или это не проблема avr-libc и winavr?