5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79

avr-gcc, ассемблер, директивы резервирования инициализированной памяти

20.10.2024, 21:40. Показов 2719. Ответов 30
Метки avr (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Какие директивы резервирования инциализированной памяти в avr-gcc?

В nasm'a я знаю что это выглядит так:
Assembler
1
2
section .data
msg db "Hello, world!", 10, 0
Как я понимаю, синтаксис для avra выглядит следующим образом:
Assembler
1
msg: .db "Hello, world!", 10, 0
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2024, 21:40
Ответы с готовыми решениями:

Ассемблер AVR-AS из AVR-GCC
Помогите начать программировать на этом ассемблере. Интересует: - подробное описание синтаксиса(желательно на русском): макросы,...

Директивы резервирования памяти
При компиляции следующей строчки ассемблер выдает ошибку (ну оно и понятно, число превышает байт): x db 0100000000h А вот при...

Сколько байт памяти будут распределены после выполнения заданной директивы языка ассемблер
Здраствуйте, нужна ваша помощь в следующих заданиях: Сколько байт памяти будут распределены после выполнения заданной директивы языка...

30
1472 / 487 / 72
Регистрация: 22.09.2023
Сообщений: 1,492
20.10.2024, 22:38
Лучший ответ Сообщение было отмечено Medusa Kaiser как решение

Решение

https://ftp.gnu.org/old-gnu/Ma... as_7.html:

.ascii "string"...
.ascii expects zero or more string literals (see section Strings) separated by commas. It assembles each string (with no automatic trailing zero byte) into consecutive addresses.

.asciz "string"...
.asciz is just like .ascii, but each string is followed by a zero byte. The "z" in `.asciz' stands for "zero".

.byte expressions
.byte expects zero or more expressions, separated by commas. Each expression is assembled into the next byte.

.double flonums
.double expects zero or more flonums, separated by commas. It assembles floating point numbers. The exact kind of floating point numbers emitted depends on how as is configured. See section Machine Dependent Features.

.fill repeat , size , value
result, size and value are absolute expressions. This emits repeat copies of size bytes. Repeat may be zero or more. Size may be zero or more, but if it is more than 8, then it is deemed to have the value 8, compatible with other people's assemblers. The contents of each repeat bytes is taken from an 8-byte number. The highest order 4 bytes are zero. The lowest order 4 bytes are value rendered in the byte-order of an integer on the computer as is assembling for. Each size bytes in a repetition is taken from the lowest order size bytes of this number. Again, this bizarre behavior is compatible with other people's assemblers.

size and value are optional. If the second comma and value are absent, value is assumed zero. If the first comma and following tokens are absent, size is assumed to be 1.

.float flonums
This directive assembles zero or more flonums, separated by commas. It has the same effect as .single. The exact kind of floating point numbers emitted depends on how as is configured. See section Machine Dependent Features.
Ну и так далее, там по ссылке еще куча вариантов. Выбирайте наиболее подходящий в каждой конкретной ситуации.
1
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
21.10.2024, 09:09  [ТС]
Благодарю! То что надо.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
21.10.2024, 13:01
Вот тут уже важно в какой секции вы это делаете.
Assembler
1
2
3
4
5
.text
.asciz "Flash data"
 
.data
.asciz "RAM data"
Причем данные в прошивку попадут, естественно, только данные из .text. Секция .data нужна скорее чтобы распределить память под переменные, но записывать в них значения придется вручную.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <avr/io.h>
 
.data
  var1: .word 1
  var2: .byte 2
 
.text
RESET:
;инициализация переменных var1 и var2
  ldi r16, 1
  sts var1, r16
  ldi r16, 2
  sts var2, r16
  
;что-то с ними делаем
  lds r16, var1
  lds r17, var2
  add r16, r16
  sts var2, r16
loop:
  rjmp loop
Да, как видите, в avr-as директивы немного отличаются: .byte, .half, .word, ...
0
1472 / 487 / 72
Регистрация: 22.09.2023
Сообщений: 1,492
21.10.2024, 13:39
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Причем данные в прошивку попадут, естественно, только данные из .text. Секция .data нужна скорее чтобы распределить память под переменные, но записывать в них значения придется вручную.
Ну не совсем так. Начальные значения ("образ") этих данных можно поместить в секцию .text в скрипте редактора связей:
Code
1
2
3
4
5
6
7
8
9
10
    .data :
    {
        . = ALIGN(4);
        __data_start = .;       /* start of .data label */
        KEEP( *(.data) )
        KEEP( *(.data.*) )
        . = ALIGN(4);
        __data_end = .;         /* end of .data label */
    } > RAM AT > TEXT
    __data_image = LOADADDR(.data); /* start of initialized data label */
И потом (да, вручную, но одним махом) в цикле cкопировать __data_end - __data_start байтов начиная с адреса __data_image в область, начинающуюся с __data_start.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
21.10.2024, 14:03
Цитата Сообщение от Dushevny Посмотреть сообщение
Ну не совсем так. Начальные значения ("образ") этих данных можно поместить в секцию .text в скрипте редактора связей:
Ключевое выделил. Но для этого придется писать linker script, разбираться с его синтаксисом, писать код инициализации секций .data и .bss. ТСу это пока рано.
0
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
21.10.2024, 14:58  [ТС]
Цитата Сообщение от Dushevny Посмотреть сообщение
Начальные значения ("образ") этих данных можно поместить в секцию .text в скрипте редактора связей:
Зачем?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
21.10.2024, 15:19
Medusa Kaiser, вы знакомы с Си или другими языками высокого уровня? Запись int x = 123; вам о чем-нибудь говорит? Проблема в том, что при включении контроллера в его оперативке будет мусор. А чтобы там появились осмысленные данные, придется писать код, который их туда запишет. Пока ваши программы простые, достаточно полностью ручной записи. А представьте, что вам понадобился здоровенный буфер на сотню байт. Не писать же кучу ldi + sts в столбик. Вот поэтому и выделяют во флешке специальную область, где хранятся начальные значения всех переменных плюс специальный стартап-код, который их оттуда читает и копирует в оперативку. А заодно прочую базовую инициализацию вроде стека, прерываний и т.п.
Еще раз говорю, что это актуально для более-менее сложных программ. Мне, например, на ассемблере avr не пригодилось ни разу. Когда понадобилось писать что-то сложное, уже использовал Си.
А с линкер-скриптами и стартап-кодом познакомился совсем недавно, когда изучал контроллеры risc-v.
1
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
21.10.2024, 15:53  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А представьте, что вам понадобился здоровенный буфер на сотню байт.
Что мешает его выделить в .bss или в .data, а потом просто воспользоваться адресной арифметикой как в Си? Или вот есть пример на nasm'e:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
section .bss
array resb 256   ; "массив" из байтов
 
section .text
  mov ecx, 256   ; счётчик
  mov edi, array ; заносим в Destination Index адрес
  mov al, '@' 
again:
  mov [edi], al  ; заносим '@' как элемент "массив"
  inc edi        ; увеличиваем адрес
  dec ecx        ; уменьшаем счётчик
  jnz again      ; jump not zero
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
с линкер-скриптами и стартап-кодом
С этим ужасом недавно тут познакомился. То что для линкёра можно что-то писать, даже в мыслях не было, я думал его только для объединения модулей используют... Ну и "немножко магии", чтобы модуль превратить в исполняемый файл задав точку входа, например (тут для меня пока тёмный лес, поэтому только догадываюсь).
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
21.10.2024, 17:17
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
Что мешает его выделить в .bss или в .data, а потом просто воспользоваться адресной арифметикой как в Си? Или вот есть пример на nasm'e:
Я же только что расписал что мешает: то, что при включении контроллера там будет мусор, а не данные. Чтобы в секции .data появились данные, их надо туда откуда-то записать.
Представьте, что вы к контроллеру подключили какое-то внешнее устройство, которое управляется текстовыми строками. Ну, например, светофор, понимающий команды "RED 10", "GREEN 50", "YELLOW 100", число - яркость в процентах. Одним из решений будет завести полуфабрикатную строку, что-то вроде
Assembler
1
2
3
4
.data
cmd_red: .asciz "RED xxx\r\n"
cmd_green: .asciz "GREEN xxx\r\n"
cmd_yellow: .asciz "YELLOW xxx\r\n"
А в самом коде менять только xxx на числа:
Assembler
1
2
3
4
5
6
7
8
9
10
11
color_red:
  ldi r16, 1
  ldi r17, 0
  ;записываем "100"
  sts (cmd_red + 4), r16
  sts (cmd_red + 5), r17
  sts (cmd_red + 6), r17
  ldi XH, hi8(cmd_red)
  ldi XL, lo8(cmd_red)
  rcall send_cmd
  ret
Здесь я не трогаю байты 0-3 (в них как было "RED ", так и остается) и 7-9 ('r\', '\n', '\0'), а меняю только 4-6. Но чтобы в 0-3 и 7-9 байтах были осмысленные значения, их туда нужно записать. Это можно сделать руками:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ldi r16, 'R'
sts (cmd_red + 0), r16
ldi r16, 'E'
sts (cmd_red + 1), r16
ldi r16, 'D'
sts (cmd_red + 2), r16
ldi r16, ' '
sts (cmd_red + 3), r16
ldi r16, '\r'
sts (cmd_red + 7), r16
ldi r16, '\n'
sts (cmd_red + 8), r16
ldi r16, 0
sts (cmd_red + 9), r16
Но вы видите, как это неудобно даже для несчастных 7 байтов. Поэтому все эти значения инициализации записывают в отдельную секцию флеш-памяти, а при старте программы копируют в .data. Что-то вроде
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
ldi ZH, hi8(_data_load)
ldi ZL, lo8(_data_load)
ldi XH, hi8(_data_start)
ldi XL, lo8(_data_start)
ldi YH, hi8(_data_end)
ldi YL, lo8(_data_end)
1:
  lpm r16, Z+
  st X+, r16
  cp XL, YL
  cpc XH, YL
    brlo 1b
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
mov ecx, 256 ; счётчик
Судя по ecx, похоже на ассемблер для x86. Но это не контроллер, а процессор. Там юзерские программы запускаются не железом, а операционной системой. А она часть операций проделывает самостоятельно. В том числе может подготовить секцию .data.
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
С этим ужасом недавно тут познакомился. То что для линкёра можно что-то писать, даже в мыслях не было, я думал его только для объединения модулей используют... Ну и "немножко магии", чтобы модуль превратить в исполняемый файл задав точку входа, например (тут для меня пока тёмный лес, поэтому только догадываюсь).
На avr это и не нужно. Там дефолтный скрипт достаточно грамотно написан. А уж когда перейдете на Си, и вовсе беспокоиться не надо будет.
0
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
23.10.2024, 20:08  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я же только что расписал
Я не очень умный.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
что при включении контроллера там будет мусор, а не данные. Чтобы в секции .data появились данные, их надо туда откуда-то записать.
В секции .data мусора как раз не будет, это секция инициализированных данных, в отличие от .bss -- секция неинициализированных данных. И по этим данным под программу выделяется оперативная память под управлением ОС. А malloc() память дополнительно выделяет, а free() освобождает. (Тут конечно всё чуть сложнее. free(), как мне известно, память освобождает, но при этом она продолжает принадлежать выполняющейся программе. При следующем malloc() будет взята сначала эта "освободившаяся" память, а только потом дополнительная. Как конкретно идёт освобождение оперативной программы, я не знаю.)

Как всё это дело работает с МК я пока не знаю. Идут ли cmd_*:, в оперативную память при включении МК?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А в самом коде менять только xxx на числа:
Осмелюсь предположить, что должно быть так, если работа со строками:
Assembler
1
2
  ldi r16, '1'
  ldi r17, '0'
ASCII же. :Р

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Представьте, что вы к контроллеру подключили какое-то внешнее устройство, которое управляется текстовыми строками.
Пока что этот пример дальше пропущу. Т.к. попытался поработать со строками и UART и пока неуверенно себя чувствую чтобы продолжить дисскусию. Вроде даже получалось кривость-накость выводить сообщение объявленное в секции .data. Но это было скорее по неведомой случайности. Так что, чтобы продолжить дискуссию, мне нужно понять как с этим работать.

Предположим, что UART у меня инициализирован правильно (я уже с отдельными байтиками поигрался, например спокойно вывожу все символы от A до Z, а в конце ставлю перенос строки и завершаю подпрограмму).

Есть код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
.data                                                                           
msg:    .asciz "Hello, world!\n"  
 
main:                                                                           
        rcall uart_send_A_Z                                                     
        ;rcall uart_send_hello                                                  
        rjmp main                                                               
;main: 
 
main:
uart_send_hello:                                                                
        push r16                                                                
        push ZL                                                                 
        push ZH                                                                 
                                                                                
        ldi ZL, lo8(msg)        ; Set ptr to msg in Z-register.                 
        ldi ZH, hi8(msg)        ;                                               
1:                                                                              
        lpm r16, Z+             ; Post inc Z.                                   
        cpi r16, 0              ; Check if msg[i] \0.                           
        breq 1f                 ; Finish subroutine if \0 byte.                 
                                                                                
        rcall wait_UDRE0                                                        
                                                                                
        sts UDR0, r16           ; Send byte.                                    
        rjmp 1b                                                                 
1:                                                                              
        pop ZH                                                                  
        pop ZL                                                                  
        pop r16                                                                 
        ret                                                                     
;uart_send_hello:                                                               
                                                                                
                                                                                
wait_UDRE0:                                                                     
        push r16                                                                
                                                                                
1:      lds r16, UCSR0A         ; Wait until bit UDRE0 will be set in UCSROA    
        sbrs r16, UDRE0         ; register and UDR0 will be ready to send byte. 
        rjmp 1b                                                                 
                                                                                
        pop r16                                                                 
        ret                                                                     
;wait_UDRE0:
В какой-то момент оно даже как-то работало, когда вместо этого:
Assembler
1
2
3
1:      lds r16, UCSR0A         ; Wait until bit UDRE0 will be set in UCSROA    
        sbrs r16, UDRE0         ; register and UDR0 will be ready to send byte. 
        rjmp 1b
мой сверхинтеллект сделал так :
Assembler
1
2
3
1:      ldi r16, UCSR0A         ; Wait until bit UDRE0 will be set in UCSROA    
        sbrc r16, UDRE0         ; register and UDR0 will be ready to send byte. 
        rjmp 1b
Параллельно прерывание TIM_0VF мигало светодиодиком, а от количества nop'ов выше sts UDR0, r16 зависело качество выводимого текста. (Зря систему контроля версия тут не использовал, такой шедевр потерял.)

Цитата Сообщение от Dushevny Посмотреть сообщение
https://ftp.gnu.org/old-gnu/Ma... as_7.html
Тут не всё работает с avr-gcc. Вот тут больше похоже на правду. К сожалению, нет примеров с обращением к выделенной памяти.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
23.10.2024, 22:42
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
В секции .data мусора как раз не будет, это секция инициализированных данных
И в третий раз повторю: чтобы в секции .data оказало то, что вы туда записали, вам придется написать соответствующий код. Сами по себе данные в оперативке не появятся.
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
А malloc() память дополнительно выделяет, а free() освобождает.
Мы про контроллеры говорим. Тут не принято злоупотреблять динамической памятью.
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
Осмелюсь предположить, что должно быть так, если работа со строками:
Да, вы правы. Я писал из головы и в этом моменте ошибся.
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
Assembler
1
2
3
.data 
msg: .asciz "Hello, world!\n" 
main:
Директиву .text забыли. Вы же не хотите код main() располагать в оперативке.
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
мой сверхинтеллект сделал так :
Assembler
1
ldi r16, UCSR0A
Э? Вы там следите за своим сверхинтеллектом... На кой ему 0xC0 в регистре r16?
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
rjmp 1b
Ага! Таки начали применять локальные метки. Это радует.
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
Тут не всё работает с avr-gcc. Вот тут больше похоже на правду. К сожалению, нет примеров с обращением к выделенной памяти.
Есть один чит. Можно написат ькод на Си и посмотреть в какие команды ассемблера он развернется. В некоторых случаях очень удобно.
0
10 / 8 / 2
Регистрация: 01.11.2019
Сообщений: 95
23.10.2024, 23:08
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
ока что этот пример дальше пропущу. Т.к. попытался поработать со строками и UART и пока неуверенно себя чувствую чтобы продолжить дисскусию. Вроде даже получалось кривость-накость выводить сообщение объявленное в секции .data. Но это было скорее по неведомой случайности. Так что, чтобы продолжить дискуссию, мне нужно понять как с этим работать.
Код, который вы привели абсолютно не рабочий. Там много ошибок. Ниже я написал аналогичную программу (рабочую) для atmega328P:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
;
;
; AssemblerApplication1.asm
;
; Created: 23.10.2024 21:31:27
; Author : 1
;
 
 
; Replace with your application code
.cseg       ; програмный сегмент
        ;стек я не проинициализировал, так как не пользую его здесь. Вообще надо.
.org 0
.set    freq=8      ;Частота МК в мГц
.set    baud=9600   ;скорость передачи, бод
.set    UBRRr=freq*1000000/(16*baud)-1; вычисление значения скорости в UBRR
 
;инициализация UART
        
        ldi r16,high(UBRRr) ;записываем скорость
        sts UBRR0H,r16      ;sts вместо out так как адрес регистра вне адресов использования команды out
        ldi r16,low(UBRRr)
        sts UBRR0L,r16
 
        ldi r16,1<<TXEN0        ;разрешение передачи
        sts UCSR0B,r16
        
        ldi r16,0b110           ;Длинна кадра 8 бит
        sts UCSR0C,r16
 
        ;r16-символ на вывод
        ;r17-счётчик символов на вывод
        ;r18-просто регистр для чтения статуса бита UDRE0 
begin:      ldi zl,low(msg*2)   ;загружаем адрес переменной msg в рег.пару Z
            ldi zh,high(msg*2)  
 
            lpm r17,z+  ;загружаем в счётчик кол-во символов на вывод
m1:         lpm r16,z+
            rcall UartOut
            dec r17
            brne m1
 
m2:         rjmp m2 ;конец
 
UartOut:    lds r18,UCSR0A
            sbrs r18,UDRE0
            rjmp UartOut
            sts UDR0,r16
            ret
 
msg:    .db 21,"Hello, Medusa Kaiser!"  ;21 'кол-во символов в выражении "Hello, Medusa Kaiser!" ВАЖНО!!! общее кол-во символов должно быть чётным! 21+1=22
                                ;(это если переменную объявляешь в програмной памяти)
Фьюз CKDIV8 не запрограмирован. Т.е. если вывода не будет то тогда freq=1

Вот HEX:
Code
1
2
3
4
5
6
7
:020000020000FC
:1000000000E00093C50003E30093C40008E0009300
:10001000C10006E00093C200E6E3F0E0159105910F
:1000200003D01A95E1F7FFCF2091C00025FFFCCF48
:100030000093C60008951548656C6C6F2C204D65C3
:0C00400064757361204B61697365722167
:00000001FF
Миниатюры
avr-gcc, ассемблер, директивы резервирования инициализированной памяти  
0
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
23.10.2024, 23:23  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Директиву .text забыли. Вы же не хотите код main() располагать в оперативке.
При копировании потерялась. Она есть перед jmp RESET, всё нормально.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Э? Вы там следите за своим сверхинтеллектом... На кой ему 0xC0 в регистре r16?
Работает? Не трогай!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ага! Таки начали применять локальные метки. Это радует.
Пациент не безнадёжен!

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Мы про контроллеры говорим. Тут не принято злоупотреблять динамической памятью.


Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И в третий раз повторю: чтобы в секции .data оказало то, что вы туда записали, вам придется написать соответствующий код.
Перенёс в секцию .text свою строку и заработало!

Но .data это же static storage which has an initializer that is not all zeroes...

Тут ТС надо ещё подумать...

Добавлено через 8 минут
Цитата Сообщение от MrQwert Посмотреть сообщение
Код, который вы привели абсолютно не рабочий.
Естественно я же его писал! Это не весь код, многая часть выпилена.

Также у меня не avra, а avr-gcc -- другой диалект ассемблера. Т.е. если я сейчас скопирую ваш код, мне ассемблер в первую очередь что-то вроде "...uknown pseudo-op ".cseg"..."

А так все мелкие задачки, которые я перед собой ставил оно выполняет.
По UART отдельной подпрограммой выдаёт символы от A до Z.
По UART отдельной подпрограммой выдаёт "Hello, world!\n" (Спасибо за это COKPOWEHEU. Но с секцией .data я ещё поговорю.)
По прерыванию таймера 0 мигает светодиодиком.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
24.10.2024, 00:28
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
Перенёс в секцию .text свою строку и заработало!
Но .data это же static storage which has an initializer that is not all zeroes...
Тут ТС надо ещё подумать...
Подумайте. В частности, об устройстве оперативной памяти. Ее особенность в том, что она не сохраняет данные при отключенном питании. Соответственно при старте контроллера в ней будет просто рандомный мусор. Это свойство вообще любого ОЗУ, не важно в составе контроллера, процессора или планки памяти.
И еще раз напоминаю: не смешивайте программирование под операционную систему и под контроллеры. В первом случае у вас есть целое окружение, написанное умными дяденьками. Оно может инициализировать области памяти, обеспечивать защиту от доступа в недоступные места и т.п. А во втором случае в роли умных дяденек - вы. Железо за вас делать ничего не будет, вы должны сами ему сказать что и куда копировать.
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
По прерыванию таймера 0 мигает светодиодиком.
Тоже можно похвалить.
0
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
24.10.2024, 07:48  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Железо за вас делать ничего не будет, вы должны сами ему сказать что и куда копировать.
Пройдя отрицание, гнев, торг, депрессию, ТС дошёл до стадии принятия и осознания, что SRAM сама себя не заполнит и пошёл учить матчать.
0
10 / 8 / 2
Регистрация: 01.11.2019
Сообщений: 95
24.10.2024, 07:51
Я, признаюсь, не знал что такое существует и не понимаю: что такое avr-gcc. Можете понятно объяснить (ссылками на "для чайников" в том числе) что это такое?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
24.10.2024, 08:39
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
Пройдя отрицание, гнев, торг, депрессию, ТС дошёл до стадии принятия и осознания, что SRAM сама себя не заполнит и пошёл учить матчать.
К чему все эти терзания? Можно же было взять какой-нибудь код на Си и посмотреть в какой дизасм он разворачивается. Там будет два цикла, один для копирования .data, второй для зануления .bss. Если даже разработчики компилятора (которые куда умнее вас или меня) вынуждены этим заниматься... видать, оно и правда нужно. Кстати о .bss: насколько я помню, занулять ее требуется только по соглашениям Си, но не ассемблера.
И еще одно соображение. На метку RESET вы можете попасть не только из-за включения питания, но и из-за ресета или из-за бутлоадера. Та же Ардуина, например. Вот вы ее прошили через USB, тамошний загрузчик заполнил начало флеша - а потом передал туда управление. Но вот ОЗУ вашему коду досталось какое было, со всем бутлоадерным мусором.
Цитата Сообщение от MrQwert Посмотреть сообщение
Я, признаюсь, не знал что такое существует и не понимаю: что такое avr-gcc. Можете понятно объяснить (ссылками на "для чайников" в том числе) что это такое?
Не понял вопрос.
Из определения, gcc - GNU C compiler или GNU compiler collection. Одновременно компилятор языка Си и оболочка для вызова разных компиляторов. В том числе, как видите, и ассемблерного. В отличие от ассемблера, gcc проходит весь поток создания исполняемого файла - препроцессирование (разворачивание #define, #include и т.д.), компиляция (превращение файлов исходного кода в объектные, *.c->*.o, *.asm->*.o, ...) и линковка (объединение объектных файлов, добавление библиотек, расстановка адресов, ... чтобы получить исполняемый файл *.o+*.o+...+*.o -> *.elf).
0
10 / 8 / 2
Регистрация: 01.11.2019
Сообщений: 95
24.10.2024, 11:06
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
gcc - GNU C compiler или GNU compiler collection.
Т.е. получается, что в этой среде писать программу надо в текстовом редакторе, используя специальные директивы для вставки кусков кода на различных языках (СИ, Ассемблер...) А затем это всё компилируется. Но как отладка происходит? Например, в Протеусе, я подозреваю, в МК записывается объектный файл. В какой ещё программе отладку можно делать?
0
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
24.10.2024, 14:40  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
К чему все эти терзания?
Без драмы не так весело.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Можно же было взять какой-нибудь код на Си и посмотреть в какой дизасм он разворачивается.
Скоро до этого дойду, я думаю.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
со всем бутлоадерным мусором.
Сейчас, чисто гипотетически, бутлоадер у меня отсутствует и его надо заново зашивать.

Цитата Сообщение от MrQwert Посмотреть сообщение
в этой среде
Я не уверен, что слово "среда" в данном случае применима.

Цитата Сообщение от MrQwert Посмотреть сообщение
писать программу надо в текстовом редакторе
Меня лично бесит, что каждая IDE навязывает свой встроенный текстовый редактор.

Цитата Сообщение от MrQwert Посмотреть сообщение
Но как отладка происходит?
Подключается такой великолепный отладочный инструмент как "отладочная печать". Но т.к. это программирование не под ОС, то эту печать ещё надо реализовать. Так что я в случае чего ориентируюсь на светодиод.

Как выполнять отладку AVR без эмулятора/симулятора (с ходу разницу не вспомню) -- я не знаю. Знаю, что к STM платам можно непосредственно подключаться вот прям через gdb.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.10.2024, 14:40
Помогаю со студенческими работами здесь

STM8 после AVR с AVR-GCC
Привет! В процессе знакомства с STM8 накопились мелкие вопросы, ответы на которые пока не нашел: - Есть ли аналог AVR-GCCшного...

Уничтожение объектов в инициализированной памяти. sed::allocator
Есть данный код: #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;memory&gt; using namespace std;

Gcc-avr
Здравствуйте. Прочитал немного про компиляторы, и решил написать программу, которая будет из Android приложения прошивать Arduino (этакий...

Не работает ассемблер под GCC
сначала я долго искал как включить ассемблерный код в c++ под g++. (В boland это было крайне просто.) ( asm{ код ...

GCC-AVR Linux
Вот такая констукция #asm .equ __y2s_port=0?12 ;PORTD .equ __sda_bit=0 .equ __scl_bit=1 #endasm компилятор не переваривает,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru