@Serpens412

Как задать значение переменной в SRAM при ее объявлении?

Только недавно начал изучать ассемблер 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 при старте контроллера?
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Фактически, по адресу 0x0060 лежит какой-то мусор, который никак не относится к тому, что я туда хотел положить.

Откуда взялся адрес 0x0060 и как вы поняли что там лежит?

TL;DR: код копирующий данные из FLASH в SRAM и обнуляющий .bss не линкуется по умолчанию. gcc вставляет ссылку на неопределённые символы __do_copy_data и __do_clear_bss в каждую единицу трансляции, в которой определяются объекты в секции .data и .bss соответственно. В написанных руками ассемблерных файлах их можно упомянуть явно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы