Только недавно начал изучать ассемблер AVR, под контроллер Atmega8, использую компилятор AVR-GCC. И возник вопрос - как можно задать значение переменной в SRAM при объявлении в секции .data? Под компилятор AVRASM2 это делается, как я понял, примерно так:
.DSEG
variable: .byte 0xff
Однако, подобный код для AVR-GCC не приводит к похожему результату:
.data
variable: .byte 0xff
Фактически, по адресу 0x0060 лежит какой-то мусор, который никак не относится к тому, что я туда хотел положить. Однако, если мы посмотри размер программы с помощью avr-size, мы увидим, что у нас в секции .data занято 2 байта:
AVR Memory Usage
----------------
Device: atmega8
Program: 64 bytes (0.8% Full)
(.text + .data + .bootloader)
Data: 2 bytes (0.2% Full)
(.data + .bss + .noinit)
Если из объявления убрать значение переменной (0xff), то в секции дата будет 0 байт. В файле .lst мы видим такую картину в секции .data:
Disassembly of section .data:
00800060 <_edata-0x2>:
800060: ff 00 .word 0x00ff ; ????
Почему компилятор пытается засунуть в память слово, и почему эти данные (ни слово, ни байт) в конечном итоге не попадают в память? И стоит ли вообще так объявлять данные, возможно, лучше при инициализации полностью очищать SRAM при старте контроллера?