LINUX.ORG.RU

Тестирование «чистой» asm функции

 , ,


0

2

Написал я, к примеру, процедуру умножения двух 10-битных чисел (с АЦП приходят такие) в 3 байта результата - для МК у которого нет аппаратного умножения (ATTiny13, в Атмел Студии 6). Проверил на нескольких примерах - работает. Захотел проверить для всего диапазона значений (вполне по силам, всего 10^6 вариантов) - и встрял. На асме могу накидать циклы - но там нет референса с чем сравнивать (умножения то нет). Могу на своем Блабе написать эмулятор этого восьмибитного контроллера, и это даже совсем не сложно, и проверять что угодно... Или можно создать Си-МК-проект, вызвать там мою асм-функцию, передавать ей входные параметры в нужные регистры, и сравнивать с тем, что посчитает компилятор по функции * ? Как это вообще делается?


Ответ на: комментарий от beastie

Писать весь проект на С? По нескольким причинам, включая спортивную составляющую, хотелось бы написать на асме. Или написать на С эту функцию а потом просто скопипастить себе то, что наоптимизирует компилятор? Это уже ближе к истине, но я отстал от жизни - в С есть уже трехбайтовые переменные? И могу я объяснить компилятору, что в моих 2 байтах множителей лежат всего по 10 бит, чтобы он лишние действия не делал? И еще много чего... Экономлю такты - повышаю частоту опроса датчиков и улучшаю ПИД.

Ivana
() автор топика

Произведение двух 10-битных чисел не влазит в 3 байта, очевидно. Ровно так же, как и 10^6.

Алгоритм же там несложный — сдвигай да прибавляй. Чего ты там проверить хочешь?

Если с сями, то да, один вариант — вставить асм в код на си, другой и более простой — слинковать.

Однако, проверять правильность алгоритмов проще на большой машине. Поэтому, либо симуляторы архитектуры AVR (simavr, например, он поддерживает tiny13), либо любой компилятор-интерпретатор — до тех пор, пока не наступит просветление.

anonymous
()
Ответ на: комментарий от Ivana

в С есть уже трехбайтовые переменные?

А смысл, когда они всё равно не нативные для данной архитектуры? Как я помню, avr работает либо с 8 битными, либо с 16 битными, записанными в специальные пары регистров. А так да, ты можешь сделать 3-байтные переменные: char foo[3];

И могу я объяснить компилятору, что в моих 2 байтах множителей лежат всего по 10 бит, чтобы он лишние действия не делал?

Ты пишешь алгоритм умножения. (Как я понял, аппаратной поддержки в этой модели нет) Только тебе решать, будет он работать с 10 битами, 20 или со 100500-ми.

А вообще, есть же стандартный ABI. Можешь часть на C написать, часть на ассемблере, проблем нет

anonymous
()

SMT-солвером проверь

SZT ★★★★★
()
Ответ на: комментарий от anonymous

Произведение двух 10-битных чисел не влазит в 3 байта, очевидно. Ровно так же, как и 10^6

На всякий случай проверил на калькуляторе (не 10+10 < 24, это руками справился, а 256^3 > 10^6). Так что продолжаю пребывать в заблуждении, что результат в 3 байта влезает. Алгоритм конечно несложный, просто столкнулся со сложностями его проверки. Конечно проверять проще на компе - я использую Atmel Studio 6. И скорее всего действительно проще будет вызывать асм-код в тестовом Си-проекте.

SZT, Про SMT-солвер погуглю что это такое, спасибо.

Ivana
() автор топика
Ответ на: комментарий от anonymous

Произведение двух 10-битных чисел не влазит в 3 байта, очевидно. Ровно так же, как и 10^6.

этот анонимус неправ

10 + 10 = 20, что меньше 3 * 8 = 24

Harald ★★★★★
()
Ответ на: комментарий от Harald

Ага, я уже погуглил про SMT-солверы ) Осталось освоить что-нибудь типа Agda/Coq/Idris и доказать там ее истинность )

Ivana
() автор топика
Ответ на: комментарий от Ivana

И могу я объяснить компилятору, что в моих 2 байтах множителей лежат всего по 10 бит, чтобы он лишние действия не делал?

В каком-то asm-е есть инструкция умножения набора бит? В каком современном процессоре время выполнения команды умножения зависит от данных? Я так отстал от прогресса? )))))

yyk ★★★★★
()
Ответ на: комментарий от yyk

Просто если я поставлю звездочку между двумя шортами, компилятор будет перемножать все их 16 бит, и результат я не определю как 3 байта одной буквой (переменной). А мне надо по 10. А если я сэмулирую умножение через сложение и сдвиги на Си, то это будет моя же функция, только в профиль.

Ivana
() автор топика
Ответ на: комментарий от Ivana

если в остальных битах может быть мусор - можно замаскировать перед умножением

не понимаю, какая может быть экономия в (2 бита + 8 бит) * (2 бита + 8 бит) по сравнению с (8 бит + 8 бит) * (8 бит + 8 бит).

Или в МК совсем нет умножения? Всё только через сложение и сдвиг? Тады «ОЙ» :)

yyk ★★★★★
()
Ответ на: комментарий от yyk

Экономия во всем - в тактах на операцию - да, в этом МК совсем нет умножения, иначе бы тема проверки своего велосипеда не возникла. А еще экономия в регистрах - 3 против 4, меньше писать/доставать из ОЗУ/стека, что опять же лишние движения и такты.

Ivana
() автор топика
Ответ на: комментарий от Ivana

Угу, я уже почитал - страх и ужас :)

В целях просвещения: для чего такие обрубки используются?

yyk ★★★★★
()
Ответ на: комментарий от yyk

Не, ну конечно можно взять МК помощнее, или вообще Ардуину какую-нибудь и на Си все написать разбрасываясь ресурсами. Но вот захотелось из тини и палок сделать ПИД - спорт такой, но там по минимуму все что надо есть: 4 АЦП (3 для задания коэффициентов и 1 на датчик), пара ШИМ - на двигатель, все 8 ног будут задействованы (даже ресет переопределен как вход АЦП)...

Ivana
() автор топика
Ответ на: комментарий от Ivana

все 8 ног будут задействованы

Кстати, насчёт минимализма. Недавно в журнале попадалась статья о том, что сегодня уже не обязательно использовать только 8-бит без умножения. Появилсь ARM Cortex-M0+ в... 8-ножном DIP-корпусе за центы. Но при этом - это целый 32-битный МК с 30 MHz! LPC81xM. Хотя, признаю, 12-бит АЦП / 5 каналов есть в LPC82x, который начиная с TSSOP20 (классические переходнички на DIP есть). Может, уже есть и другие аналогичные модели. Т.е. минималистичность того или иного МК оцениваешь включая цену или как?

gag ★★★★★
()
Ответ на: комментарий от gag

Цена конечно выше какого-то предела начинает сказываться, но до него - некритична. А вот идея выжать максимум из минимума самоценна. Например, мне нужно 2 таймера - для шим и для опроса датчика по прерыванию. А у меня один - буду заводить его на нужную частоту шим, а опрос датчика делать каждое n-е прерывание. И т.д.

Ivana
() автор топика

А ты, кстати, попробуй вывод компилятора разобрать, он может там уже оптимально делает при простом A*B. С оптимизацией по скорости попробуй.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.