Перейти к содержанию

Где Правильно Делать Математику - В Обработчике Или Основном Цикле?


vd_

Рекомендуемые сообщения

Подскажите пожалуйста как можно замерить время выполнения сабрутин? Есть ли такие средства в AVRStudio или ещё где? Обдумываю как правильно построить програмку тахометра - сначала делал расчеты в обработчике прерывания таймера, потом в основном цикле, а теперь запутался. Это из Ревича Практическое програмирование основной код и динамическая индикация отсюда http://smartep.ru/index.php?category=electronics&group=project&id=2

Если я правильно понимаю - из прерывания нужно выходить быстро, и делать там по возможности мало. Или к микроконтроллерам это не относится?

Ещё такой вопрос - там на входе будет сигнал с индуктивного датчика 24в - его можно просто через резистор понизить (до 5?) и на входной транзистор? Или нужно как-то развязывать?

И последний вопрос - почему в протеусе семисегментный индикатор так медленно обновляется когда стробы через транзисторы подключены? Пока было напрямую от атмеги обновлялось нормально, как только добавил транзисторы - перестали прорисовываться цифры. Если нажать паузу и в дебагере прошагать - всё прорисовывается как надо, а если просто выполняется - пусто. Я добавил задержку - в строке 353 поменял 5 на 190 - вроде стало прорисовываться, но обновляется очень медленно. Это в протеусе проблема или я чего-то не так делаю?

Заранее спасибо за ответ

tacho.zip

Ссылка на комментарий
Поделиться на другие сайты

Если я правильно понимаю - из прерывания нужно выходить быстро, и делать там по возможности мало. Или к микроконтроллерам это не относится?

Это относится в первую очередь к микроконтроллерам, в силу отсутствия у них многопоточности.
Ссылка на комментарий
Поделиться на другие сайты

Если я правильно понимаю - из прерывания нужно выходить быстро, и делать там по возможности мало. Или к микроконтроллерам это не относится?

Именно так. Если вычисления объемные (в смысле, занимают много времени) то лучше вынести в главный цикл, чтобы не мешать другим прерываниям. Если короткие - то можно и в прерываниях.

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

К МК, особенно если это AVR, это относится в большей мере, чем к компам, по причине гораздо меньшей вычислительной мощности. С STM32 это не так актуально.

Вообще, в МК избегают арифметики с плавающей точкой, заменяя ее арифметикой с фиксированной точкой, а функции вычисляют не разложением в ряд Тейлора, а таблично с кусочно-линейной интерполяцией. Основной принцип - как можно меньше вычислений.

Теперь как замерить время выполнения процедур. Если есть свободный таймер, используешь его. В процедуру вначале вставляешь сброс этого таймера, а в конце запоминаешь то значение, которое он успел насчитать. Это и будет время в "тиках". Его можно преобразовать к единицам времени и вывести на индикацию. Или на терминал через UART.

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А можно в родном отладчике посмотреть время выполнения.

Насчет протеуса - возможно, он обрабатывает транзисторы как аналоговые устройства. Если они нужны только для изменения полярности сигнала (с точки зрения эмулятора, а не реальной схемы, разумеется), можно заменить на логические инверторы и, разумеется, убрать ограничительные резисторы - программа не перегорает.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Если я правильно понимаю - из прерывания нужно выходить быстро, и делать там по возможности мало. Или к микроконтроллерам это не относится?

Именно так. Если вычисления объемные (в смысле, занимают много времени) то лучше вынести в главный цикл, чтобы не мешать другим прерываниям. Если короткие - то можно и в прерываниях.

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

К МК, особенно если это AVR, это относится в большей мере, чем к компам, по причине гораздо меньшей вычислительной мощности. С STM32 это не так актуально.

Вообще, в МК избегают арифметики с плавающей точкой, заменяя ее арифметикой с фиксированной точкой, а функции вычисляют не разложением в ряд Тейлора, а таблично с кусочно-линейной интерполяцией. Основной принцип - как можно меньше вычислений.

Теперь как замерить время выполнения процедур. Если есть свободный таймер, используешь его. В процедуру вначале вставляешь сброс этого таймера, а в конце запоминаешь то значение, которое он успел насчитать. Это и будет время в "тиках". Его можно преобразовать к единицам времени и вывести на индикацию. Или на терминал через UART.

Спасибо - я подозревал что-то в этом роде. А если например расчеты занимают много циклов и неукладываются в предпологаемый интервал между прерываниями наверное нужно запрещать прерывания перед началом расчетов CLI и снова разрешать по окончании SEI?

Если тахометр, то почему "шесть дырок на оборот"? Какие дырки и оборот чего? У Вас какой-то особенный датчик?

Это обычный индуктивный датчик - он стоит на шкиву с шестью дырками для облегчения, это можно представить как спицы в колесе. Есть металл перед датчиком - на выходе датчика 24в, нет металла - 0в, шесть раз сменился сигнал = один оборот вала.

Ссылка на комментарий
Поделиться на другие сайты

Не переживайте, все успеете за один интервал между импульсами. Разве нельзя было взять сигнал искрообразования с блока зажигания или его датчика? Импульсов меньше - времени для расчетов больше.

Ссылка на комментарий
Поделиться на другие сайты

... в родном отладчике посмотреть время выполнения...

Что вы имеете ввиду под родным отладчиком? AVRStudio4? Я пролистал инструкцию - вроде ничего об этом. Подскажите пожалуйста из какого раздела какого документа можно ознакомится с этим средством.

... сигнал искрообразования с блока зажигания или его датчика...

это для зубошлифовального станка, там счетчик оборотов для индикации двойных ходов долбяка на шкиву перед шатуном, зажигания совсем нет, от электромотора приводится...

Ссылка на комментарий
Поделиться на другие сайты

Что вы имеете ввиду под родным отладчиком? AVRStudio4? Я пролистал инструкцию - вроде ничего об этом. Подскажите пожалуйста из какого раздела какого документа можно ознакомится с этим средством.

В 4 студии при отладке можно посмотреть время, прошедшее с момента запуска, когда надо его можно сбрасывать вручную.

На счет датчика - возможно, стоит использовать внешнее тактирование для какого-нибудь таймера. Выводы T0, T1, ... вроде. Пусть аппаратно считает, без вызова прерываний. Упс, это и так сделано.

post-58864-0-43902200-1440534859.png

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

А если например расчеты занимают много циклов и неукладываются в предпологаемый интервал между прерываниями наверное нужно запрещать прерывания перед началом расчетов CLI и снова разрешать по окончании SEI?

А вот это ни в коем случае! А если будет пропущен (или как вариант задержан, если запрещенное прерывание запоминается) сигнал с датчика?

Нет, если уж вычислительной мощности не хватает, а достаточно хорошо оптимизировать не удается - только взять МК помощнее.

Если не хватает мощности обычного компа, то с тормозами можно смириться, а вот для систем на МК это может быть фатально.

Иногда запрет прерываний бывает необходим, например, чтобы сделать операцию чтение-модификация-запись какой либо переменной атомарной, но в случае простой переменной это займет только несколько тактов и не опасно.

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Нет, если уж вычислительной мощности не хватает... взять МК помощнее.

Автор взялся писАть на Ассме. О какой нехватке вычислительной мощности, в такой задаче, тут можно говорить? Что тут высчитывать? Если конечно решать на Си по известным формулам, тогда согласен (измерять, делить, умножать, возводить в степень... :) ). Может проще, увеличить вычислительную мощность мозгов и подойти к задаче с другой стороны?

Для начала, не плохо бы узнать, в каких единицах автор желает получить результат (об/сек., об/мин., об/час) и какая точность требуется.

Ссылка на комментарий
Поделиться на другие сайты

А если например расчеты занимают много циклов и неукладываются в предпологаемый интервал между прерываниями...

Он спросил не про эту конкретную задачу, а про общий случай. Я и ответил про общий случай

Что касается вычислительной мощности мозгов, то я вообще то говорил про оптимизацию. И только если не удается оптимизировать так, чтобы все влезло по времени, тогда брать МК мощнее. Хотя, конечно, сначала выбирается метод решения задачи и алгоритм, а уже потом - МК.

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

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Rafid, я выразился не про Вас, а лишь сделал "ответвление" вариантов решения от Вашей мысли. Не надо Вам оправдываться.

Единственное могу заметить, какие бы современные оптимальные компиляторы не существовали, решение на Ассме всегда оптимальнее.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Опытный программист, конечно, может оптимизировать программу лучше, чем компилятор, но ради десятка процентов скорости или экономии памяти писать на асме все - овчинка выделки не стоит - слишком уж сильно снижается производительность труда самого программиста. Ни один работодатель не пойдет на это :) Поэтому программы пишут всегда на С или другом языке программирования высокого уровня и только потом критические участки кода могут переписать на асме.

Ссылка на комментарий
Поделиться на другие сайты

В коммерческом проекте - возможно. Тогда могут выбрать и ардуину вместо ATtiny13 просто потому что так проще программисту и железячнику. Но когда делаешь для себя, тем более, когда мало опыта в оптимизации, лучше начать с асма, прочувствовать камень. Потом проще будет переходить на ЯВУ.

Ну и многие алгоритмы на Си просто невозможно написать компактнее и быстрее, чем на асме, или хотя бы сравнимо, несмотря на всю автооптимизацию.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Да и в некоммерческом тоже - в конце-концов, программирование, это просто инструмент, чтобы получить готовое устройство, и терять время просто так нерационально даже в том случае, если это твое собственное свободное время (ты ведь хочешь побыстрее получить работающее устройство? :) Хотя, наверное, есть люди, которые получают удовольствие от самого процесса программирования, но и тогда лучше быстрее закончить с одним девайсом и взяться за другой, чем корпеть долго над одним, программируя на асме). А вот если человек получает удовольствие именно от кодирования на асме :D ну что тут сказать - тогда пусть пишет на асме :) хотя это, на мой взгляд просто понты и мазохизм :)

Ну, мое мнение такое. Может, оно именно такое, потому что я программист, и это для меня просто работа, причем зачастую рутинная. Язык, среда разработки - всего лишь рабочий инструмент, и выбираешь то, что позволяет выполнить работу лучше и быстрее.

По поводу оптимизации. Есть расхожее мнение, что оптимизация - это оптимизация кода, и тут лучше использовать асм. Это не так, есть три уровня оптимизации (по мере убывания эффективности)

1) Выбор оптимального метода решения задачи (алгоритма)

2) Алгоритмическая оптимизация (выбранного на 1 этапе алгоритма)

3) Оптимизация кода (программы, реализующей оптимизированный на 2 этапе алгоритм)

Первые два, и частично третий не зависят от языка, а поскольку второй и особенно первый более эффективны, то и на асме можно написать очень неоптимальную программу, если пренебречь первыми двумя :)

А камень? Мне, например, чтобы прочувствовать камень, достаточно держать под рукой даташит с описанием его архитектуры. Ведь в МК не так важно, сколько в нем есть РОНов или какие у него команды, сколько то, как организована периферия и как с ней работать. Да и знания о РОНах и командах (которые будут нужны только если на третьем этапе понадобится использовать асм, а до этого дело скорее всего и не дойдет вовсе, если более высокоуровневая оптимизация проведена хорошо) тоже можно почерпнуть из даташита.

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Кстати, в коммерческом проекте, если его планируется запустить в серию, пусть даже мелкую, вряд ли кто-то будет использовать Ардуину. Она хороша как средство быстрого прототипирования, или изготовления одного-двух экземпляров, но для серии это будет уже слишком дорого.

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

...(ты ведь хочешь побыстрее получить работающее устройство? :)

...пусть пишет на асме :) хотя это, на мой взгляд просто понты и мазохизм :)

Быстро только кролики... :) Даже для коммерческого проекта важно, чтобы устройство не столько быстрее заработало, сколько чтобы оно заработало не кое-как.

Иногда требуется реинжиниринг, а тут без знания Ассма ну никак. Ну и для создания проекта (даже на Ассме) много времени не требуется (при определенном опыте работы с ним), больше времени уходит на выискивание глюков и отладку кода, а это что там, что там - одинаковые заморочки.

И все-же. Мы несколько отвлеклись от темы. Где же наш vd_? Повторю вопрос. Какая цена деления прибора? Точность? Диапазон? Что он должен в итоге делать, стабилизировать частоту или просто "индицировать" кол-во оборотов? Сколько должно быть разрядов индикации? И тд., и тп.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Понятно, что имеется ввиду скорость не в ущерб качеству. Дело в том, что производительность труда одного и того же программиста, одинаково хорошо владеющего и асмом, и С, выраженная в количестве строк отлаженного кода в день, величина примерно постоянная, а поскольку асм, так сказать, более многословен, на получение качественного продукта на асме уйдет гораздо больше времени. Это подтверждается и многолетней практикой - программирование как специальность существует более 50 лет, и если бы разница в производительности между написанием на ЯВУ и на асме не была велика, ЯВУ занимали бы скромную нишу, а асм доминировал бы, однако в реальности дела обстоят наоборот.

Для реинжиниринга асм конечно нужен, не спорю, но сейчас есть защита от чтения флеш, даже в "любительских" avr, если не ошибаюсь.

Возвращаясь к теме, если ТС нужен будет ПИД регулятор частоты вращения, математика понадобится действительно серьезная. При высокой частоте вращения и хорошей точности, ресурсов может и не хватить.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...