MPetrovich 6 23 июля Опубликовано 23 июля · Жалоба Всех приветствую. Есть программа индикации оборотов, в ней таймером считается период и переводится в об/сек - n=k/T, где к - константа, а Т - подсчитанный период. Обороты меняются и делить приходится на непредсказуемую величину. Если бы делить на константу, то там я знаю как - сдвинул влево, умножил, сдвинул вправо. А вот как оптимизировать деление в моём случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 71 23 июля Опубликовано 23 июля · Жалоба 41 минуту назад, MPetrovich сказал: Всех приветствую. Есть программа индикации оборотов, в ней таймером считается период и переводится в об/сек - n=k/T, где к - константа, а Т - подсчитанный период. Обороты меняются и делить приходится на непредсказуемую величину. Если бы делить на константу, то там я знаю как - сдвинул влево, умножил, сдвинул вправо. А вот как оптимизировать деление в моём случае? И зачем считать период если можно сразу считать обороты. Все равно период на индикатор чаще чем раз в треть секунды нет смысла выводить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 23 июля Опубликовано 23 июля · Жалоба 9 minutes ago, artemkad said: Все равно период на индикатор чаще чем раз в треть секунды нет смысла выводить. Вы так считаете? Попробуйте кино смотреть с частотой кадров в 3 герца... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 71 23 июля Опубликовано 23 июля · Жалоба 6 минут назад, MPetrovich сказал: Вы так считаете? Попробуйте кино смотреть с частотой кадров в 3 герца... Так в том-то и дело, что тут надо видеть каждый кадр отображаемого значения, а иначе мельтешащий разряд сливается в нечитаемую мешанину. Даже возможно надо будет выводить еще медленнее, а иначе последний разряд не успеваешь осознать. 1 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 5 23 июля Опубликовано 23 июля · Жалоба Quote иначе последний разряд не успеваешь осознать Это если индикатор не стрелочный. А дальше вопрос требуемой точности. Если она невелика, то можно попробовать обойтись байтовым делением - оно будет быстрее, чем более длинное. Опять же, для байтового можно и табличку в 256 значений себе позволить, а дальше сдвигами добрать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 71 23 июля Опубликовано 23 июля · Жалоба Только что, Alex11 сказал: Это если индикатор не стрелочный. И что должна означать расплывшаяся стрелка? Ведь именно ее и получим если сделаем вывод 25 разных значений за секунду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 5 23 июля Опубликовано 23 июля · Жалоба Можно, например, оценивать джиттер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 71 23 июля Опубликовано 23 июля · Жалоба 1 минуту назад, Alex11 сказал: Можно, например, оценивать джиттер. В попугаях? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 23 июля Опубликовано 23 июля · Жалоба 56 минут назад, MPetrovich сказал: Вы так считаете? Попробуйте кино смотреть с частотой кадров в 3 герца... Имхо - для индикации достаточно обновления ~10Гц. Ну пускай, для самых быстроглазых = 20Гц. Неужто ваш AVR не справится с делениями 20 раз в секунду? И про какую точность идёт речь? 16 бит? 32 бита? ... PS: При большой разрядности делителя, можно попробовать рядом Тейлора найти 1/x в несколько итераций, а затем - умножать. Но накладные расходы - большие, не факт что будет выигрыш. На DSP (без аппаратного деления, но с многоразрядными умножениями) это был вариант, на AVR - надо смотреть. Ведь у него и команды умножения дохлые. И вряд-ли есть другие альтернативы, кроме тупого деления в лоб (сдвигами/вычитаниями). Пускай и отимизированным на асме кодом. Иначе команды деления в разных CPU не были бы такими тормозными. При малой разрядности - таблица. (как уже писали выше) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 23 июля Опубликовано 23 июля · Жалоба On 7/23/2024 at 4:29 PM, jcxz said: Имхо - для индикации достаточно обновления ~10Гц. Ну пускай, для самых быстроглазых = 20Гц. Неужто ваш AVR не справится с делениями 20 раз в секунду? И про какую точность идёт речь? 16 бит? 32 бита? Так, для справки. Код на ассемблере ;*************************************************************************** ;* ;* "div16u" - 16/16 Bit Unsigned Division ;* ;* This subroutine divides the two 16-bit numbers ;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor). ;* The result is placed in "dres16uH:dres16uL" and the remainder in ;* "drem16uH:drem16uL". ;* ;* Number of words :196 + return ;* Number of cycles :148/173/196 (Min/Avg/Max) ;* Low registers used :2 (drem16uL,drem16uH) ;* High registers used :4 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH) ;* ;*************************************************************************** https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/doc0936.pdf Т.е. если на 16 МГц тактовой, то одно деление примерно 12 мкс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 23 июля Опубликовано 23 июля · Жалоба 51 minutes ago, jcxz said: Неужто ваш AVR не справится с делениями 20 раз в секунду? Справляется, не вопрос. Просто обидно, что молотит зря. У него ещё одно прерывание на входе (кроме отсчёта оборотов) с частотой 100Гц, плюс прерывание по окончании формируемого импульса(тут правда обработчик коротенький), ну и динамическая индикация и вывод кое-чего через UART в терминал... 51 minutes ago, jcxz said: На DSP (без аппаратного деления, но с многоразрядными умножениями) это был вариант, на AVR - надо смотреть. Эка Вы хватили! На STM32 тоже проблем никаких бы не возникло, там деление в одно действие))) 18 minutes ago, dimka76 said: Код на ассемблере Прошу прощения, но с ассемблером не дружу 😞 18 minutes ago, dimka76 said: на 16 МГц тактовой Тактовая 8 МГц Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 23 июля Опубликовано 23 июля · Жалоба 24 минуты назад, MPetrovich сказал: Эка Вы хватили! На STM32 тоже проблем никаких бы не возникло, там деление в одно действие))) На STM32 есть аппаратное деление (по крайней мере на тех, которые >=Cortex-M3), на многих DSP - нет. Так что в этом плане к AVR они ближе. Да и на тех STM32 тоже не факт, что "в одно действие". А всё сильно зависит от разрядности. О которой вы так ничего и не сказали. 24 минуты назад, MPetrovich сказал: Прошу прощения, но с ассемблером не дружу 😞 Тогда речь об "оптимизировать деление" вести бессмысленно. PS: Хочу написать супер-пупер роман. Объясните как. Да - с грамотой не дружу, алфавита не знаю.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 23 июля Опубликовано 23 июля · Жалоба On 7/23/2024 at 5:19 PM, MPetrovich said: На STM32 тоже проблем никаких бы не возникло, там деление в одно действие))) Что вы имеете ввиду под одним действием ? Деление на Cortex-M3 требует от 2 до 12 тактов. On 7/23/2024 at 5:39 PM, jcxz said: На STM32 есть аппаратное деление (по крайней мере на тех, которые >=Cortex-M3), на многих DSP - нет. А при чем тут DSP ? On 7/23/2024 at 5:19 PM, MPetrovich said: Прошу прощения, но с ассемблером не дружу 😞 ATMEL уже все за вас написал. Вам только надо код, написанный ATMEL, подключить к своему проекту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MPetrovich 6 23 июля Опубликовано 23 июля · Жалоба 2 hours ago, dimka76 said: Деление на Cortex-M3 требует от 2 до 12 тактов. А разве деление float/float не в одно действие? Другой вопрос сколько в конкретном Cortex тактов на операцию... Хотя, конечно, это к теме не особо относится))) 3 hours ago, jcxz said: 3 hours ago, MPetrovich said: Прошу прощения, но с ассемблером не дружу 😞 Тогда речь об "оптимизировать деление" вести бессмысленно. Ну Вам виднее. 2 hours ago, dimka76 said: ATMEL уже все за вас написал. Вам только надо код, написанный ATMEL, подключить к своему проекту. Это в той ссылке, что Вы прикрепили? Спасибо, покурю этот апнот :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 23 июля Опубликовано 23 июля · Жалоба On 7/23/2024 at 8:44 PM, MPetrovich said: А разве деление float/float не в одно действие? Другой вопрос сколько в конкретном Cortex тактов на операцию... Речь же шла о Cortex-M3. В нем нет float. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться