$regfile = "m328pdef.dat"
$crystal = 1000000
$framesize = 32
$hwstack = 40
$swstack = 16$baud = 4800
Dim Temp As Byte
Dim Percent As Byte'Функция расчёта процентов из байтового значения (0...255)
Declare Function Calculate_percent(byval Val_byte As Byte) As ByteDo
Incr Temp
'Время исполнения 78 тактов
Percent = Calculate_percent(temp)Print Temp ; " " ; Percent ; "%"
Loop
End'===============================================================================
Function Calculate_percent(byval Val_byte As Byte) As Byte
'-------------------------------------------------------------------------------
'Забираем данные из "Val_byte"
!ld R16 , X
!ldi R17 , 100 '1
!Mul R16 , R17 '2
!movw R16 , R0
'Деление на 255 (сдвиг вправо на 8)
!lsr R17
!ror R16
!lsr R17
!ror R16
!lsr R17
!ror R16
!lsr R17
!ror R16
!lsr R17
!ror R16
!lsr R17
!ror R16
!lsr R17
!ror R16
!lsr R17
!ror R16
'Забираем адрес "Calculate_percent"
!ld R26 , Y+2
!ld R27 , Y+3
'Забираем готовые данные
!st X , R16
'-------------------------------------------------------------------------------
End Function
'===============================================================================
Расчёт процентов на ASM
Сообщений 1 страница 21 из 21
Поделиться12022-01-09 22:16:10
Поделиться22022-01-09 23:12:13
$regfile = "m328pdef.dat"
$crystal = 1000000
$framesize = 32
$hwstack = 40
$swstack = 16$baud = 4800
Dim Temp As Word
Dim Percent As Byte'Функция расчёта процентов из байтового значения (0...255)
Declare Function Calculate_percent(byval Val_word As Word) As ByteTemp = 500
Do
Incr Temp
'Время исполнения 115 тактов
Percent = Calculate_percent(temp)Print Temp ; " " ; Percent ; "%"
Loop
End'===============================================================================
Function Calculate_percent(byval Val_word As Word) As Byte
'-------------------------------------------------------------------------------
'Забираем данные из "Val_word"
!ld R26 , Y
!ld R27 , Y+1
!ld R20 , X+
!ld R21 , X
!ldi R22 , 100 '1
!clr R23'Умножение переменных Word * Byte
!mul R23 , R21
!mov R18 , R0
!mul R22 , R20
!movw R16 , R0
!mul R23 , R20
!add R17 , R0
!adc R18 , R1
!mul R21 , R22
!add R17 , R0
!adc R18 , R1
'Деление на 1024 (сдвиг вправо на 10)
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
!lsr R18
!ror R17
!ror R16
'Забираем адрес "Calculate_percent"
!ld R26 , Y+2
!ld R27 , Y+3
'Забираем готовые данные
!st X , R16
'-------------------------------------------------------------------------------
End Function
'===============================================================================
Поделиться32022-01-10 17:02:13
Универсальный вариант 255...512...1024
Вариант выбирается здесь "Const Size_percent = 255...512...1024"
$regfile = "m328pdef.dat"
$crystal = 1000000
$framesize = 32
$hwstack = 40
$swstack = 16$baud = 4800
Dim Temp As Word
Dim Percent As Byte'===============================================================================
'Функция расчёта процентов, возможные варианты: 255, 512, 1024
Const Size_percent = 1024#if Size_percent = 255
Const Div_size_percent = 8 '133 такта
#endif
#if Size_percent = 512
Const Div_size_percent = 9 '139 тактов
#endif
#if Size_percent = 1024
Const Div_size_percent = 10 '145 тактов
#endifDeclare Function Calculate_percent(byval Val_word As Word) As Byte
'===============================================================================Do
Incr Temp
'Время исполнения 133...139...145 тактов
Percent = Calculate_percent(temp)Print Temp ; " " ; Percent ; "%"
Loop
End'===============================================================================
Function Calculate_percent(byval Val_word As Word) As Byte
'-------------------------------------------------------------------------------
'Забираем данные из "Val_word"
!ld R26 , Y
!ld R27 , Y+1
!ld R20 , X+
!ld R21 , X
!ldi R22 , 100 '1
!clr R23'Умножение переменных Word * Byte
!mul R23 , R21
!mov R18 , R0
!mul R22 , R20
!movw R16 , R0
!mul R23 , R20
!add R17 , R0
!adc R18 , R1
!mul R21 , R22
!add R17 , R0
!adc R18 , R1
'Деление на нужный делитель (сдвиг вправо на 8_9_10)
!ldi R19 , Div_size_percent
Next_calculate_percent:
!lsr R18
!ror R17
!ror R16
!dec R19
!brne Next_calculate_percent'Забираем адрес "Calculate_percent"
!ld R26 , Y+2
!ld R27 , Y+3
'Забираем готовые данные
!st X , R16
'-------------------------------------------------------------------------------
End Function
'===============================================================================
Поделиться42022-01-20 19:07:57
Сверхзвуковое ускорение:
Вход = байт (нужная переменная 0...255)
Выход = байт (переменная в процентах 0...100 %)
Время выполнения = 7 или 15 тактов МК
$regfile = "m328pdef.dat"
$crystal = 1000000
$framesize = 32
$hwstack = 40
$swstack = 16$baud = 4800
Dim Temp As Byte
Dim Percent As ByteDo
Incr Temp
'=======================================================
'Выполнение подпрограммы с входом и выходом, 15 тактов
Gosub Calculate_perzent
'=======================================================
'А так, Ёханая Бабайка, 7 тактов
'=======================================================
'Забираем данные из переменной (0...255)
!lds R16 , {Temp} '2 такта
!ldi R17 , 100 '100% 1 такт
!Mul R16 , R17 '2 такта
'Забираем готовые данные (0...100 %)
!sts {Percent} , R1 '2 такта
'=======================================================Print Temp ; " " ; Percent ; "%"
Loop
End'===============================================================================
Calculate_perzent:
'-------------------------------------------------------------------------------
'Забираем данные из переменной (0...255)
!lds R16 , {Temp}
!ldi R17 , 100 '100%
!Mul R16 , R17
'Забираем готовые данные (0...100 %)
!sts {Percent} , R1
'-------------------------------------------------------------------------------
Return
'===============================================================================
Следующий вариант: Гиперзвук, правда уже нема куда.
Поделиться52022-01-21 12:45:11
Следующий вариант: Гиперзвук, правда уже нема куда.
Ща мода на облачные вычисления. 
А так надо не забывать, что надо ещё сохранять флаги и используемые регистры (а это уже увеличивает количество тактов и юзает стек).
Отредактировано RDW (2022-01-21 12:51:52)
Поделиться62022-01-21 13:25:13
Ща мода на облачные вычисления.
Ага, и вместо "мигающей лампочки" получаем "сервер-интернет-WiFi"
Модно, понтово, дорого ))) да и еще потребность всё это обслуживать...
Красота...
Поделиться72022-01-21 19:43:24
А ещё можно использовать в виде макроса
$regfile = "m328pdef.dat"
$crystal = 1000000
$framesize = 32
$hwstack = 40
$swstack = 16$baud = 4800
Dim Temp_percent As Byte
Dim Percent As ByteMacro Calculate_perzent
'Забираем данные из переменной (0...255)
!lds R16 , {Temp_percent}
!ldi R17 , 100 '100%
!Mul R16 , R17
'Забираем готовые данные (0...100 %)
!sts {Percent} , R1
End MacroDo
Incr Temp_percent
'Выполнение макроса, 7 тактов
Calculate_perzentPrint Temp_percent ; " " ; Percent ; "%"
Loop
End
Поделиться82022-01-21 21:20:10
Занятная штука эти макросы, но малоприменимая...
Разве только для повышения быстродействия. 
Поделиться92024-03-17 15:36:05
Занятная штука эти макросы, но малоприменимая...
Разве только для повышения быстродействия.
Экономия кода !
Один макрос, во многих местах.
Поделиться102024-03-17 15:37:52
А так надо не забывать, что надо ещё сохранять флаги и используемые регистры (а это уже увеличивает количество тактов и юзает стек)
Если фрагмент не в прерывании, то для чего ?
Поделиться112024-03-17 19:37:04
Экономия кода !
Один макрос, во многих местах.
Как, собственно и подпрограмма... 
Экономия кода с макросом копеечная, а вот на быстродействии сказывается заметно...
Возможно, если скорость критична, стОит отказаться от подпрограмм и т.п.
В такой редакции - 15 тактов (п/п) против 7 (макрос):
Dim Temp_percent As Byte
Dim Percent As Byte
'=========================================Do
Incr Temp_percent
Gosub Calc_perzent
Print Temp_percent ; " " ; Percent ; "%"
Loop
End
'=========================================
Calc_perzent:
!lds R16 , {Temp_percent}
!ldi R17 , 100 '100%
!Mul R16 , R17
'Забираем готовые данные (0...100 %)
!sts {Percent} , R1
Return
Поделиться122024-03-17 21:15:41
Экономия кода !
Один макрос, во многих местах.
Ценой увеличения размера прошивки!
Подпрограммы в этом плане лучше.
Поделиться132024-03-17 21:49:56
Ценой увеличения размера прошивки!
Подпрограммы в этом плане лучше.
Увы... С макросом меньше получается... 
В моем тесте (МК - Mega48): с макросом - 11%, с п/п - 12%...
Разумеется, что неиспользуемые при компиляции макрос или п/п, равно как и строки их вызова - закомментированы...
Я бы сказал, что с п/п - привычнее... 
Макросы надо размещать вначале, что несколько мешает листанию.
П/п - все в конце, как правило после END (у меня в частности
)...
Поделиться142024-03-17 22:13:29
Увы... С макросом меньше получается...
Макрос это автоматизированное копирование участков кода. Меньше будет только если в макросе пара асм инструкций. То есть меньше чем нужно для вызова подпрограммы и возврата из нее.
Поделиться152024-03-17 22:38:05
Макрос это автоматизированное копирование участков кода.
По логике работы это так и есть, да и в Справке об этом говориться.
Только полученные цифры пока почему-то говорят другое... 
Меньше будет только если в макросе пара асм инструкций. То есть меньше чем нужно для вызова подпрограммы и возврата из нее.
Я использовал код, приведенный Александром, только МК заменил.
И в макросе и в п/п - одинаковые наборы операторов.
Результат описал... 
При использовании п/п добавляется 8 тактов на каждый вход/выход.
А это далеко не NOP, это время выполнения операций для сохранение/восстановление адресов входа/выхода при вызове п/п.
Возможно (!) эти операции и дают прирост размера прошивки, ведь эти адреса не вычисляются статично при компиляции, а определяются "по ходу пьесы".
ИМХО, спор пока ни о чем... 
Нужно наваять что-то с большим количеством макросов и (или) п/п и уже это сравнивать. 
Поделиться162024-03-18 07:58:49
Я использовал код, приведенный Александром, только МК заменил.
И в макросе и в п/п - одинаковые наборы операторов.
Результат описал...
Данный код ни чего не показывает. И макрос, и пп вообще можно не использовать в этом коде.
Вот когда вы будете использовать макрос или пп несколько раз(соб-но для этого их и пишут) Тогда и увидите разницу.
Тот же код, сделайте вызов пп/макроса хотя бы 3 раза
Поделиться172024-03-18 10:43:09
Только полученные цифры почему-то говорят другое..
как уже написал KIP, Вы сделали не очень верный пример, от того и цифры "с потолка".
да, сделайте хотя бы 10-12 вызовов того и другого и всё будет гораздо нагляднее.
Поделиться182024-03-18 12:16:17
Не до конца дочитали ? 
Я про это же в #15 написал...
Поделиться192024-03-18 21:12:46
Добрался до "большого", поэкспериментировал...
Таки да, был неправ насчет конечного размера кода 
Пошел по пути, предложенному kip и Александр Д, с вызовом макроса или п/п 10 раз подряд.
С макросом конечный код увеличивается, с п/п - нет.
Но и прироста в скорости работы с макросом особого не заметил, хотя ожидалось...
Тестировался полный цикл с приращением Temp_percent + 5:
- с макросом - 333,642 mS
- с п/п - 333,999 mS
Поделиться202024-03-18 21:44:45
С макросом конечный код увеличивается, с п/п - нет
Логично, не правда ли? ))))
ПП: Звонок_Мужу
Вася, купи хлеба!
пока хватит
Давай Звонок_Мужу = 6 байт
Давай Звонок_Мужу = 6 байт
Давай Звонок_Мужу = 6 байт
Давай Звонок_Мужу = 6 байт
Итого: 6*4 = 24 байта
Вася, купи хлеба!
Вася, купи хлеба!
Вася, купи хлеба!
Вася, купи хлеба!
Итого: 17*4= 68 байт
---
Как бы вот ))
Поделиться212024-03-18 21:58:56
Логично, не правда ли? ))))
Было бы логичнее довести этот вопрос до конца еще вчера, но вечер был занят другим... 
Пришлось искать доказательства только спустя сутки. 

