Народ, Огромное Вам Спасибо.
Конечно же -O0 имело место быть.
Уже даже начал кусочек ASMa цитировать, как обратил внимание на "кучу, кучу всего".
Жалко времени, гадко, что у самого ума не хватило, но опыта нет, а опыт - сын ...
Включил оптимизацию, все заработало.
Не знаю, как дальше пойдет дело, но просьба, если не сложно, прокоментируйте фрагмент кода, с которого все началось.
Возможно есть откровенные бока.
На счет маски 0x01ff - это была последняя надежда, хоть и глупая (где-то увидел).
CODE
void
EEPROM_write(volatile u08 bankNumber, volatile void *data, volatile u08 length){
cli();
u16 address = 1 + bankNumber * length;
u16 endAddress = address + length;
u08* pointer = (u08*) data;
while(address < endAddress){
while(EECR & _BV(EEWE)); // Ждать завершения предыдущей записи
EEAR = address++; // Проинициализировать регистр адреса
EEDR = *(pointer++);
EECR |= _BV(EEMWE); // Установить флаг EEMWE
EECR |= _BV(EEWE); // Начать запись в EEPROM
}
while(EECR & _BV(EEWE)); // Ждать завершения предыдущей записи
EEAR = 0; // Сбросить адрес EEPEROM в "0"
sei();
}
void
EEPROM_read(volatile u08 bankNumber, volatile void *data, volatile u08 length){
cli();
u16 address = 1 + bankNumber * length;
u16 endAddress = address + length;
u08* pointer = (u08*) data;
while(address < endAddress){
while(EECR & _BV(EEWE)); // Ждать завершения предыдущей записи
EEAR = address++; // Проинициализировать регистр адреса
EECR |= _BV(EERE); // Выполнить чтение
*(pointer++) = EEDR;
}
while(EECR & _BV(EEWE)); // Ждать завершения предыдущей записи
EEAR = 0; // Сбросить адрес EEPEROM в "0"
sei();
}
Может подскажите, как написать Си код, что бы без оптимизации нормально компилился.
Еще раз всем огромное Спасибо.
Сообщение отредактировал rezident - Feb 5 2009, 20:05
Причина редактирования: Уменьшение видимого объема цитаты исходника.