Цитата(_Pasha @ Jan 5 2009, 11:02)

1. На кой икс держать множество инлайновых вызовов eeprom_read_*** ?
Я всего лишь показал, как можно обращаться и к структуре целиком и к отдельному её полю и к независимой переменной. И в комментариях отметил, что можно так, а можно сяк.
Цитата(_Pasha @ Jan 5 2009, 11:02)

2. eeprom_write_block() туповат - придется переписать, чтобы не трогал ячейки, в которых нет изменений.
"а ещё они гнутся и сваливаются", т.е. "а ещё eeprom_write_block() останаваливает работу всего, кроме обработчиков прерываний, на время записи".
Я же говорю - пример
в самом простом виде, ведь можно и так:
Код
void
eeprom_manager::write( const void *buf, uint16_t addr, uint16_t len)
{
ee_guard pg; // тута мьютекс спрятан
const uint8_t *ptr = reinterpret_cast< const uint8_t* >(buf);
do {
uint8_t to_write = *ptr++;
EEAR = addr++;
EECR |= 1 << EERE;
if( EEDR == to_write)
continue;
write_done.Clear();
EEDR = to_write;
{
TCritSect cs;
EECR |= 1 << EEMWE;
EECR |= 1 << EEWE;
EECR |= 1 << EERIE;
}
write_done.Wait();
} while( --len);
}
OS_INTERRUPT void
EE_READY_vect()
{
OS::TISRW isrw;
EECR &= ~(1 << EERIE);
eeprom_manager::write_done.SignalISR();
}
Цитата(_Pasha @ Jan 5 2009, 11:02)

3. После хорошего совета
здесь делаю так:
Код
//все, что в еепроме, тотально объединено в структуру
typedef struct
{
****
} paramset_t;
// __MAIN__ определен там, где у нас main()
#ifdef __MAIN__
EEMEM paramset_t paramset = {большой блок инициализации};
#else
extern paramset_t paramset;
#endif
Я нарисовал выше и структуру, и "большой" (на все три поля структуры) блок инициализации. Единственное отличие - в
примере всё как бы в одном файле показал.