Сообщение от
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. Вот
тут больше похоже на правду. К сожалению, нет примеров с обращением к выделенной памяти.
Вернуться к обсуждению:
avr-gcc, ассемблер, директивы резервирования инициализированной памяти ATmega AVR