Pruvet (08.11.2007 14:09, просмотров: 98) ответил Al Volovich на Читаем даташит. На 2561 правда под рукой нет, но во всех, что просмотрел - одинаково: рекомендуют запретить прерывания.
Всем спасибо за помощь. Даташит прочитал. Но не в этом дело, декомпиляция показала, что IAR все соблюдает. Кусок памяти где расположена error_cnt портился при выполнении другого кода, который как я думаю некорректно воспринимался компилятором. Было пример:
__no_init __eeprom unsigned int error_count;
__no_init __eeprom unsigned long long saveerr[10];
void error_set(char error)
{
unsigned long long __eeprom *err = saveerr + 5;
...
*err = (1ull<<error);//Значение сохранялось по 0 адресу вместо err
}
Заработало пример:
//Записывает в EEPROM процессора n байт
void __eeprom *ememcpy(void __eeprom *d,const void *s,size_t n){
void __eeprom *result=d;
while (n--) {
*(char __eeprom *)d=*(char*)s;d=(char __eeprom *)d+1;s=(char*)s+1;
}
return result;
}
__no_init __eeprom unsigned int error_count;
__no_init __eeprom unsigned long long saveerr[10];
void error_set(char error)
{
unsigned long long __eeprom *err = saveerr + 5;
...
unsigned long long error_state=(1ull<<error);
ememcpy(err,&error_state,8);//Корректно сохраняется
}