Bug 32163
| Summary: | Ошибки в eeprom функциях | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Dmitry A. Kharitonov <kharpost> |
| Component: | avr-libc | Assignee: | qa-team <qa-team> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P3 | CC: | amakeenk, cas, kharpost, viy, week |
| Version: | unstable | ||
| Hardware: | all | ||
| OS: | Linux | ||
| Bug Depends on: | 32164 | ||
| Bug Blocks: | |||
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. |

Description
Dmitry A. Kharitonov 2016-06-01 12:31:29 MSKДля 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 Видно, что библиотечная функция обращается к неправильным портам