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

    @Serpens412 Автор вопроса
    Я ничего специально не прописывал, этот код пришёл из библиотеки.

    Возможно, gcc так компилирует код на Си.

    avr4 слегка смущает тут.

    С этим все впорядке - это архитектура процессора. Я заменил на atmega8, и добавил -c при создании файла .o - результат не изменился. В map файле это хорошо видно - все библиотеки подгружаются из /lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/. В том числе и библиотека libgcc.a, которая, если верить документации, и должна в секции .init4 подгружать данные в SRAM.

    Спасибо за Ваши ответы, благодаря им смог докопаться до истины. Для того, чтобы компилятор добавил процедуру __do_copy_data, ее надо явно объявить:
    .global __do_copy_data

    Тогда компилятор добавит код заполнения данных в SRAM из Flash, о котором Вы писали ранее.
  • Как задать значение переменной в SRAM при ее объявлении?

    @Serpens412 Автор вопроса
    Действительно, кода, подобного <__do_copy_data> у меня нет - после инициализации стека он идет сразу в main:
    Disassembly of section .text:
    
    00000000 <__ctors_end>:
       0:	12 c0       	rjmp	.+36     	; 0x26 <__init>
     // Тут идет таблица прерываний...
    
    00000026 <__init>:
      26:	11 24       	eor	r1, r1
      28:	1f be       	out	0x3f, r1	; 63
      2a:	cf e5       	ldi	r28, 0x5F	; 95
      2c:	d4 e0       	ldi	r29, 0x04	; 4
      2e:	de bf       	out	0x3e, r29	; 62
      30:	cd bf       	out	0x3d, r28	; 61
      32:	02 d0       	rcall	.+4      	; 0x38 <main>


    Это странно - нигде не встречал информацию о том, что для загрузки в SRAM нужно что-то отдельно прописывать в компилятор.
  • Как задать значение переменной в SRAM при ее объявлении?

    @Serpens412 Автор вопроса
    Запускается очень просто - подачей питания на микроконтроллер) К каждому выводу порта D подключено по светодиоду, по ним я и определяю, в каком состоянии находится каждый выход.

    Собираю с помощью утилит из avr-toolchain:
    avr-gcc -mmcu=atmega8 -Xassembler -ggdb -o bin\Test.o test.S
    avr-gcc -g -mmcu=avr4  -o bin\Test.elf bin\Test.o
    avr-objcopy -j .text -j .data -O ihex bin\Test.elf bin\Test.hex


    Полученный hex загружаю в контроллер с помощью программатора usbasp:
    avrdude -p atmega8 -c usbasp -U flash:w:bin\Test.hex
  • Как задать значение переменной в SRAM при ее объявлении?

    @Serpens412 Автор вопроса
    Адрес 0x0060 - это адрес переменной variable в SRAM. У Atmega8 SRAM начинается с этого адреса (стр 18 даташита), соответственно, первая переменная будет записана туда. Файл .lst это подтверждает - переменная variables заменяется компилятором на адрес 0x0060.

    Что там лежит, я понял по следующему коду:
    #include 	<avr/io.h>
    
    // ================= Секция SRAM =================
    		.section .data
    variable: .byte 0xff
    
    // ================= Секция FLASH ================
    		.section .text
    		.global main
    
    main:	// Устанавливаем PORTD на вывод.
    		ldi		r16, 0xff 				
    		out		_SFR_IO_ADDR(DDRD), r16
    		// Все выводы PORTD устанавливаем в ноль.
    		clr		r16
    		out		_SFR_IO_ADDR(PORTD), r16
    
    		// Загружаем из SRAM значение, лежащее по адресу variable.
    		// Ожидаем, что все выводы порта D примут значение 1...
    		lds		r16, variable
    		out		_SFR_IO_ADDR(PORTD), r16
    
    		// ... но этого не происходит.
    		rjmp 	while
    
    // Бесконечный цикл.
    while:	rjmp	while


    Следовательно, если бы у нас в памяти по адресу, на который указывает variable, лежало значение 0xff, то все выводы PORTD встали бы в единицу. Однако, этого не происходит.

    Вот так выглядит процедура main в lst файле:
    38:	0f ef       	ldi	r16, 0xFF	; 255
      3a:	01 bb       	out	0x11, r16	; 17
      3c:	00 27       	eor	r16, r16
      3e:	02 bb       	out	0x12, r16	; 18
      40:	00 91 60 00 	lds	r16, 0x0060	; 0x800060 <__EEPROM_REGION_LENGTH__+0x7f0060>
      44:	02 bb       	out	0x12, r16	; 18
      46:	00 c0       	rjmp	.+0      	; 0x48 <while>


    Это точно не проблема самого порта - я проверял это, установив туда значение 0xff, предварительно загруженное с помощью команды ldi в РОН. Также корректно ведет себя код, если перед тем, как загрузить в РОН из SRAM значение variable, предварительно загрузить его в SRAM с помощью команды sts. Тоесть, значение не устанавливается только при инициализации в секции .data,