Страница 340 из 400

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Чт дек 13, 2018 05:14:36
akl
[uquote="ARV",url="/forum/viewtopic.php?p=3525452#p3525452"]...по-моему тут поможет директива .equ[/uquote]Вполне возможно именно это и было нужно

Код: Выделить всё

.equ	CONST=16
.equ	Timer=RAMEND-CONST

	LDI	XH,HIGH(Timer)
	LDI	XL,LOW(Timer)

	LD	R0,X
Z_h_e писал(а):...ошибка с точки зрения программирвания. ИМХО, варнинги нельзя игнорировать, я так когда-то делал и зря
К варнингам отношусь очень серьёзно. Регистрам новые бессмысленные имена типа

Код: Выделить всё

.def temp=r30
не даю. Смысловые да. Типа

Код: Выделить всё

.def	_FF=R14
.def	ZERO=R15

	CLR	_FF
	COM	_FF		;всегда -1
	CLR	ZERO	;всегда 0

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Чт дек 13, 2018 06:53:20
oleg110592
пытаюсь привязать ресурс...
AVR Assembler Preprocessor: #define
https://www.microchip.com/webdoc/avrass ... efine.html
Изображение

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Чт дек 13, 2018 11:19:34
BOB51
Млин...
Там же без знака равенства...
:oops:
Воть что отсутствие непрерывной практики делаеть..
:(

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Чт дек 13, 2018 13:46:32
9RIK
Вот это да, не ожидал такого большого количества откликнувшихся, большое вам всем спасибоо) может кто то еще в протеусе смыслит?) отпшитесь в лс)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 18, 2018 13:07:07
imerlin
Привет знатокам ассемблера.
Нигде не нашел, но может все таки что и пропустил: нужна директива препроцессора позволяющая вставить в программу группу строк n раз.
Сейчас необходимо для разработки шаблона программ быстрого умножения/деления больших чисел. Проблема там в том, что при организации циклом очень большие накладные расходы на сохранение флага C (он используется в многобайтных ADC, SBC, CPC, ROL/ROR и т.д., но при этом портится в DEC), поэтому перед DEC его нужно куда то сохранять, а после - восстанавливать.
Поэтому пришел к мысли развернуть циклы - и время сэкономлю и от геморроя избавлюсь. Но затруднился с автоматизацией разворачивания (пока сделал 8 операций умножения для вариантов {1-8} байт на оператор), хочется написать что нибудь вроде

.macro zzz
LD R1,X
ROL R1
ST X+,R1
.endm

.cycle zzz(5)


чтобы сгенерить сдвиг для пяти байт.
Кто нибудь может подсказать: возможно ли такое?
Спасибо.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 18, 2018 13:47:02
ARV
средствами avr-assembler из "студии" от Atmel такое невозможно.
а вот средствами GNU AS - легко, вот небольшая моя статья об этом: https://simple-devices.ru/articles/7-so ... ler-reviev (правда, по ссылке поменялся движок сайта и врезки кода стали уродскими... я не виноват)
работать с этим ассемблером посложнее будет, чем со "студийным"

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 18, 2018 13:54:30
imerlin
Угу, спасибо.
Вдогонку:
WinAVR это интегрированная среда разработки со своими отладчиком, симуляторами и т.д.?
Или после препроцессинга результат грузится в студию и допиливается там? Просто никогда дела с ним не имел.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 18, 2018 14:07:55
ARV
студия версии 4.xx вполне себе дружит с WinAVR, позволяя делать отладку внутри себя без танцев с бубном.
WinAVR в голом виде - только компилятор. точнее, там есть и свой "отладчик" и "симулятор", но я пока не встречал героя, который бы ими пользовался :)))
новые версии студии работают так же прозрачно с "тулчейном" avr-gcc, т.к. WinAVR - устарел и не поддерживается. WinAVR - это avr-gcc версии 3.3.2, в более свежих версиях есть интересные плюшки :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 18, 2018 14:11:33
akl
[uquote="imerlin",url="/forum/viewtopic.php?p=3529356#p3529356"]...Проблема там в том, что при организации циклом очень большие накладные расходы на сохранение флага C (он используется в многобайтных ADC, SBC, CPC, ROL/ROR и т.д., но при этом портится в DEC), поэтому перед DEC его нужно куда то сохранять, а после - восстанавливать.[/uquote]Замечу, в AVR команды INC DEC флаг C не трогают, поэтому сохранять его не нужно. Мелочь, но приятно. :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 18, 2018 14:51:57
trofim2
типа так:


.listmac

.macro rol_mem
LD R1,X
ROL R1
ST X+,R1
.endm

.macro rol_5
rol_mem
rol_mem
rol_mem
rol_mem
rol_mem
.endm

.cseg

......
rol_5

.......

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 18, 2018 16:28:35
imerlin
Замечу, в AVR команды INC DEC флаг C не трогают, поэтому сохранять его не нужно. Мелочь, но приятно. :)
Хм... И правда... Почему то засело в голове, что в таблице команд указано, что меняет... Помнится матерился из-за этого долго... Толи не на ту строчку посмотрел, толи что еще... :o
Может, в каком то из даташитов ошибка вкралась?
Спасибо, что сказали, а то так бы и пребывал в заблуждении...

Но в любом случае, для сравнения все равно танцы с бубном неизбежны - на Z то ведь по любому влияет.

Добавлено after 54 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3529404#p3529404"]студия версии 4.xx вполне себе дружит с WinAVR, позволяя делать отладку внутри себя без танцев с бубном.[/uquote]

Спасибо, придется изучать...

Добавлено after 2 minutes 35 seconds:
[uquote="trofim2",url="/forum/viewtopic.php?p=3529431#p3529431"]типа так:

.macro rol_5
rol_mem
rol_mem
rol_mem
rol_mem
rol_mem
.endm


.......[/uquote]


Так в том и вопрос был, чтобы не жестко задать, а произвольно: сколько надо, столько и задано, а не именно пять. А пока примерно так и вышел из положения: прописал 8 процедур для размеров операндов от 1 до 8-ми байт.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 18, 2018 16:50:49
trofim2
Тогда типа такого:

.macro rol_
rol_mem
.if @0 >= 10
rol_mem
.endif
.if @0 >= 9
rol_mem
.endif
.if @0 >= 8
rol_mem
.endif
.if @0 >= 7
rol_mem
.endif
.if @0 >= 6
rol_mem
.endif
.if @0 >= 5
rol_mem
.endif
.if @0 >= 4
rol_mem
.endif
.if @0 >= 3
rol_mem
.endif
.if @0 >= 2
rol_mem
.endif

.endm

.cseg

......
rol_ 8

.......

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср дек 19, 2018 01:52:03
Alexeyslav
А стоит оно того? Разворачивать подобного рода циклы... экономия порядка 16 тактов на сдвиге 8 байт.... ценой потребления памяти в 8 раз?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср дек 19, 2018 06:45:30
ARV
Alexeyslav писал(а):А стоит оно того?
а почему нет? случаи бывают разные, например, при формировании видеосигнала придется считать каждый такт...

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср дек 19, 2018 09:17:38
imerlin
[uquote="Alexeyslav",url="/forum/viewtopic.php?p=3529839#p3529839"]А стоит оно того? Разворачивать подобного рода циклы... экономия порядка 16 тактов на сдвиге 8 байт.... ценой потребления памяти в 8 раз?[/uquote]

Иногда да. Например, при небольшой длине операндов (2-3 байта) может баш на баш выйти по объему за счет удаления цикла. Ну и верно AVR заметил, что случаи разные бывают, а я предпочитаю, если уж однажды сделал, сделать так чтобы потом с полочки взять и с минимальными изменениями снова использовать. Ну лень мне снова вспоминать, например, как деление сделать. А скоро потребуется - давно хочу приборчик добить для регулировки зажигания и карбюратора: тахометр, УОЗ, УЗСК, стробоскоп... Там если точно мерить, то много тактов набегает за оборот на низких оборотах, сейчас не помню, но то ли на 4 то ли аж на 6 байт, и все это надо делить для вычисления частоты в об/мин. А умножения в любом ПИД регуляторе нужно.
Да и вообще, может я ошибаюсь конечно, но каждый проект индивидуален, где то по памяти лимит жестче, где то по скорости, лучше, если тяжелые базовые подпрограммы будут иметь возможность выбора: скорость за счет памяти или наоборот.
Да и вообще, я задал вопрос, находясь в заблуждении о том, что команды inc/dec изменяют флаг C, и циклы получались очень уж монструозными. Сейчас перепишу версию с циклами, посчитаю такты, может и решу что не надо так уж заморачиваться.

Добавлено after 6 minutes 44 seconds:
[uquote="trofim2",url="/forum/viewtopic.php?p=3529519#p3529519"]Тогда типа такого:

.macro rol_
rol_mem
.if @0 >= 10
rol_mem
.endif
.if @0 >= 9
rol_mem
.endif
---------------------------8<-----------------------

.......[/uquote]

А через пару лет, когда уже основательно забудется как сделана эта программа, вдруг понадобится 11 байт. Не упустите, что программа может быть очень сложна, таких кусочков может быть не один десяток и с разными кратностями повторения. К тому же такой вариант слишком сложен для восприятия, не влезает целиком на экран для осмысления сути этого действия и вообще вместо облегчения работы приносит больше осложнений. Нет, судя по всему действительно, в классическом ASM для AVR эта задача не решается так как я хочу ее решить.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср дек 19, 2018 09:18:03
Alexeyslav
Формировать видеосигнал тяжелыми вычислениями? на АВР? Психушка плачет... Это несколько опрометчивые решения, там где надо каждый такт считать, нужно рассматривать другие решения - на ПЛИС например или DSP. Ведь больше времени потратите на отладку этих крох, а время дороже железа.
Такие алгоритмы вы с полочки не возьмёте, они слишком специфичны и аппаратно зависимы. Через год вы уже забудете про контроллер на котором делали эту оптимизацию, а на другом эти хаки уже не работают и т.п. взять современные ARM, там уже конвеер, разные частоты ядра и периферии и уже не столь очевидно сколько тактов уходит на конкретную конструкцию а иногда быстрее будет исполняться неказистая на вид конструкция.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср дек 19, 2018 09:30:06
ARV
Alexeyslav писал(а):взять современные ARM
возьмите уже их и покиньте тему про ассемблер AVR :kill: :twisted: :evil:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср дек 19, 2018 09:38:44
BOB51
За те циклы/подсчеты...
Я такую задачу делал когда WS2812 от АВРки запускал.
Все прекрасно контролируется и исполняется.
Причем с завидной стабильностью для случая программной широтной манипуляции
(это помимо основного генератора случайных чисел и прочей обработки).
Так что не надо "контейнер гнать" на 8-битники под ассемблером раньше времени.
8)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср дек 19, 2018 11:21:14
Alexeyslav
Так кто гонит? Контролируется, да. Но задача для WS2812 по силам контроллеру, там не надо выжимать такты ибо не успеваешь - там такты считать надо чтобы обеспечить требуемые временные параметры импульсов, это совсем другое.
возьмите уже их и покиньте тему
Возьму, конечно, когда это надо будет - т.е. когда задача перерастёт возможности AVR или будет совсем впритык - именно для того чтобы не собирать крохи чтобы обеспечить менее 10% выигрыша по скорости.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт дек 25, 2018 08:42:25
4epemyxa
прописал 8 процедур для размеров операндов от 1 до 8-ми байт.
Есть жесткие ограничения по скорости? Почему не сделать одну универсальную?
Спойлер

Код: Выделить всё

.include "m8def.inc"

.def    temp = r16
.def    counter = r17    ;счетчик сдвигаемых байтов памяти


;бла-бла-бла
;...
;=======
;где-то в теле программы:
;---- init roll counter
        ldi     temp,5             ;задание количества сдвигаемых байтов
	sts    rol_counter,temp
;---- make roll
		rcall		rol_mem
;=======
;бла-бла-бла
;...

Loop:
      rjmp  Loop

;============
; FUNCTIONS
;============
rol_mem:
		ldi		xl,low(rol_field)      ;загрузка начального адреса сдвигаемого поля 
		ldi		xh,high(rol_field)
		lds		counter,rol_counter ;загрузка счетчика
		clc
rol_01:
		ld		temp,x
		rol		temp
		st		x+,temp
		dec		counter
		brne	rol_01
		ret
;============
; DATA SEGMENT
;============
.dseg
rol_counter:	.byte 1
rol_field:		.byte 8

;***** END *****