Для MCU ATMEGA8535 не правильно откомпилированы функции для работы с eeprom Библиотечная функция не работающая функция: 0000073e <eeprom_read_byte>: 73e: f9 99 sbic 0x1f, 1 ; 31 740: fe cf rjmp .-4 ; 0x73e <eeprom_read_byte> 742: 92 bd out 0x22, r25 ; 34 744: 81 bd out 0x21, r24 ; 33 746: f8 9a sbi 0x1f, 0 ; 31 748: 99 27 eor r25, r25 74a: 80 b5 in r24, 0x20 ; 32 74c: 08 95 ret Самописная работающая функция: while(EECR&(1<<EEWE)); EEAR=(uint16_t)eeaddr; EECR|=(1<<EERE); s=EEDR; while(EECR&(1<<EEWE)); 50e: e1 99 sbic 0x1c, 1 ; 28 510: fe cf rjmp .-4 ; 0x50e <eedata_read_block+0x36> EEAR=(uint16_t)addr; 512: df ba out 0x1f, r13 ; 31 514: ce ba out 0x1e, r12 ; 30 EECR|=(1<<EERE); 516: e0 9a sbi 0x1c, 0 ; 28 s=EEDR; 518: 8d b3 in r24, 0x1d ; 29 Видно, что библиотечная функция обращается к неправильным портам
avr-libc-2.0.0-alt1
Результат проверки актуальности Состояние: Платформа p8 не поддерживается с 15.12.2019. Рекомендация: закрыть как WONTFIX.
Результат проверки актуальности в Sisyphus Состояние: В текущем avr-libc заголовки ATMEGA8535 задают верные порты EEPROM. Явного исправления в changelog нет; нужен objdump eeprom_read_byte для atmega8535. Рекомендация: ретест на Sisyphus.
*** Bug 32164 has been marked as a duplicate of this bug. ***
Проверил на Sisyphus x86_64 (обновлён 2026-09-16): avr-gcc-14.2.0-alt1_2, avr-libc-1:2.0.0-alt6_20, avr-binutils-2.35-alt1_3. $ avr-gcc -mmcu=atmega8535 -Os -o ee.elf ee.c # ee.c: eeprom_read_byte()/eeprom_write_byte() для EEMEM-переменной $ avr-objdump -d ee.elf | sed -n '/<eeprom_read_byte>:/,/ret/p' 0000005c <eeprom_read_byte>: 5c: e1 99 sbic 0x1c, 1 ; EECR.EEWE 5e: fe cf rjmp .-4 60: 9f bb out 0x1f, r25 ; EEARH 62: 8e bb out 0x1e, r24 ; EEARL 64: e0 9a sbi 0x1c, 0 ; EECR.EERE 66: 99 27 eor r25, r25 68: 8d b3 in r24, 0x1d ; EEDR 6a: 08 95 ret Порты 0x1C/0x1D/0x1E/0x1F — верные для ATmega8535 (iom8535.h), код совпадает с «самописной» функцией из описания. eeprom_write_byte/eeprom_update_byte — аналогично (sbi 0x1c,2 / sbi 0x1c,1). Функции берутся из /usr/avr/lib/avr4/libatmega8535.a через device-specs/specs-atmega8535. Код из отчёта (sbic 0x1f / out 0x22 / out 0x21 / in 0x20) — это раскладка EEPROM-регистров ATmega48/88/168; он попадал в прошивку потому, что avr-libc-2.0.0-alt1 собирался с avr-gcc 4.9 без device-библиотек (в пакете нет libatmega*.a, только общий avr4/libc.a, из которого линкер брал первый попавшийся eeprom_read_byte). Исправилось с переходом на тулчейн с device-библиотеками: avr-gcc-7.2.0-alt1_1 + avr-libc-2.0.0-alt5_6 (задание https://packages.altlinux.org/tasks/220475/, 2019-02-04). Закрываю FIXED.