Обсуждаем контроллеры компании Atmel.
Пт июн 28, 2019 19:12:12
Народ, кто-нибудь пробовал сдвиг многобайтной величины на 4 бита вправо реализовывать через операцию SWAP? Можно ли выжать чутка быстродействия по сравнению с реализацией в лоб через RORы?
Добавлено after 10 minutes 48 seconds:Судя по всему можно:
Спойлер
- Код:
;============
mov tmp1, val1
mov tmp2, val2
mov tmp3, val3
lsr tmp3
ror tmp2
ror tmp1
lsr tmp3
ror tmp2
ror tmp1
lsr tmp3
ror tmp2
ror tmp1
lsr tmp3
ror tmp2
ror tmp1
;============
mov tmp1, val1
swap tmp1
andi tmp1, 0x0F
mov tmp2, val2
swap tmp2
eor tmp1, tmp2
andi tmp2, 0x0F
eor tmp1, tmp2
mov tmp3, val3
swap tmp3
eor tmp2, tmp3
andi tmp3, 0x0F
eor tmp2, tmp3
;============
Добавлено after 7 minutes 12 seconds:Правда выигрыш всего в две операции, и он не растёт, если наращивать число байт в величине.
Сб июн 29, 2019 06:44:11
Это в пределах одного байта красиво смотрится.
А при многобайтовой цепочке придется промежуточный регистр да маски применить.
По итогу может и чуток быстрее, но сожрет дополнительные ресурсы в виде буфер-регистра.
Сб июн 29, 2019 18:27:26
...но сожрет дополнительные ресурсы в виде буфер-регистра.
Так вон, смотрите под катом: сдвинул три байта без буферов вообще. Правда мне нужен был и результат сдвига, и изначальная величина, поэтому у меня не занято лишних регистров. Если сдвигать на месте, то может и не получиться.
Добавлено after 6 minutes 50 seconds:Впрочем, получится. На месте свапами тоже прекрасно шифтится:
Спойлер
- Код:
;============
lsr val3
ror val2
ror val1
lsr val3
ror val2
ror val1
lsr val3
ror val2
ror val1
lsr val3
ror val2
ror val1
;============
swap val1
andi val1, 0x0F
swap val2
eor val1, val2
andi val2, 0x0F
eor val1, val2
swap val3
eor val2, val3
andi val3, 0x0F
eor val2, val3
;============
Пт июл 12, 2019 16:39:32
Добрый день! Помогите пожалуйста!
Имеем пятибайтную константу, например
.equ NAME=0xE7E6E5E4E3
Как из неё взять старший байт для загрузки в РОН?
Пт июл 12, 2019 19:23:10
motorist82, боюсь, никак. Я просто не знаю 64-битного ассемблера для AVR. А 32-х битный с такой константой ничего сделать не сможет.
Пт июл 12, 2019 20:17:12
вот так:
ldi R16, byte5(NAME)
Пт июл 12, 2019 21:49:20
вот так:
ldi R16, byte5(NAME)
Так не получится. Нет такой функции byte5. Придется сохранять константу в Flash. Хотя студия не ругается на
.equ Name= 0xE7E6E5E4E3
Наверное все что свыше 32 бит просто игнорируется.
Пт июл 12, 2019 21:55:40
Starichok51, А что это за ассемблер? Гнушный as меня конкретно посылает фразой "Error: bignum invalid"
Ну и про byte5 он ничего не знает.
Добавлено after 1 minute 30 seconds:
motorist82, пока константа в .equ - она для ассемблера просто строка для подстановки. Разбираться с ее содержимым он будет только при использовании имени из .equ
Пт июл 12, 2019 22:05:23
Спасибо
Вот макрос который суёт константу во Flash:
#define Address(v,w,x,y,z) NRF24_Addr: .db $##z, $##y, $##x, $##w, $##v
Используем так:
Address (E7,E6,E5,E4,E3)
Достаём из Flash:
ldZ (NRF24_Addr*2)
ldi R17, 5
Get_NRFAddr_Loop: lpm R16, Z+
dec R17
; Тут сохраняем R16 в какой-нибудь буфер для дальнейшего использования
brne Get_NRFAddr_Loop
[/code]
Сб июл 13, 2019 04:58:08
извиняюсь, я это "с потолка" взял.
byte4 работает, и я решил, что и byte5 будет работать.
Вс июл 14, 2019 19:42:28
.equ NAME=0xE7E6E5E4E3
Как из неё взять старший байт для загрузки в РОН?
А выражение
- Код:
(NAME >> 32) & 0xFF
не взлетит?
Вс июл 14, 2019 20:02:10
если сделать
(NAME >> 32)
то
& 0xFF
уже не нужно делать.
Пн июл 15, 2019 06:33:10
А выражение
- Код:
(NAME >> 32) & 0xFF
не взлетит?
Не взлетит. AVR-студия заносит 0xFF. Если через BYTE5, то заносит 0x00.
- Код:
.equ NAME=996011271395
;.equ BYTE5=NAME/4294967296
;.equ NAME=0xE7E6E5E4E3
.cseg
RESET:
RJMP START
CONST:
;.DB 0,BYTE5,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)
;.DB 0,NAME >> 32,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)
.DB 0,(NAME >> 32) & 0xFF,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)
START:
LDI ZH,HIGH(CONST*2)
LDI ZL,LOW(CONST*2)
LPM R10,Z+
LPM R11,Z+
LPM R12,Z+
LPM R13,Z+
LPM R14,Z+
LPM R15,Z
RJMP START
Пн сен 16, 2019 14:15:18
Вопрос знатокам: В AVR есть такой скрытный зверёк - регистр "PC", счётчик инструкций. Хотел узнать о нём поподробнее, как то например по какому физическому адреcу он сидит, можно ли его прочесть напрямую из программы ? Гугль молчит как партизан, неужели нигде нет подробной информации на этот счёт?
Пн сен 16, 2019 14:19:01
А зачем Вам знать это? Всё равно попытка прочитать этот регистр из программы давала бы как раз номер той инструкции, которой этот регистр читается. Что чуть менее чем бесполезно.
Пн сен 16, 2019 14:46:34
WiseLord, думаю большей степени научное любопытство
Ну может и пригодится для дебага, если будет возможность хотя бы читать.
Пн сен 16, 2019 15:59:47
DimKra, через CALL на следующую после него инструкцию и два (три для некоторых AVR) POP можете его значения получать. Но толку с него действительно немного.
Пн сен 16, 2019 17:34:09
Практического смысла нет. Смотрим описание этого регистра. Работает с командами rjmp, jmp, rcall, cal.
- Код:
rjmp pc +\- x
Глухое зацикливание программы rjmp pc + 0.
Так как команды бывают двух и четырех байтные, заманаешься вручную высчитывать насколько команд нужно прыгнуть. Именно по этой причине крайне не рекомендуется работает вручную. Только по меткам.
- Код:
Label_1:
bla-bla
rjmp +\- Label_x
bla-bla
Label_2:
Пн сен 16, 2019 19:32:07
Он-то регистр, но недоступен для чтения напрямую. Но с ним можно работать некоторыми командами - всевозможные команды перехода и возврата из подпрограммы.
Толку его читать? Он всегда указывать удет на ту инструкцию которой его прочитаешь, а это известно и так на этапе компиляции(переносимый по адресному пространству код под AVR я не видел).
Вт сен 17, 2019 08:52:33
DimKraМодификация содержимого PC производится "подстановкой адреса возврата через стек", командами call, jmp, коротких условных переходов и косвенных переходов ijmp, icall с подстановкой адреса из регистровой пары R31:R30 (она же Z).
Чтение... в принципе в некоторых случаях может иметь смысл (к вопросам отладки например) - тогда выполняем любой вызов call и считываем точку входа из верхушки стека.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.