Прерывания. Поклонники и противники.

Тема в разделе "Arduino & Shields", создана пользователем ostrov, 2 апр 2016.

  1. ostrov

    ostrov Гуру

    Хочу узнать мнения у почтенного сообщества. Какая мысль более правильная:
    - использовать прерывания только там, где иначе нельзя
    - использовать прерывания везде, где только возможно

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

    AlexU Гуру

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

    Прерывания были придуманы для обработки асинхронных событий -- они очень сильно упрощают жизнь разработчикам. Без прерываний любое устройство, которое должно получать данные из вне (последовательные порты, клавиатуры, манипуляторы и т.п.), должно было бы быть "устройством реального времени". А разработка таких устройств не очень простая задача. Одно дело мигать светодиодом по нажатию кнопки. Разработать такое "устройство реального времени" особых проблем не составляет -- и можно обойтись без прерываний от слова совсем. (Но тут встаёт вопрос -- зачем для такой простой задачи использовать микроконтроллер.) И другое дело, когда необходимо производить вычисления и параллельно реагировать на внешние события. Можно в этом случае так же обойтись без прерываний, но трудозатраты на разработку такого "устройства реального времени" без использования прерываний будут выше, чем с использованием оных.
    Есть особый вид прерываний -- прерывания по таймеру. С одной стороны события таймера -- это синхронные события (возникают в заранее известный момент времени). Но с другой стороны проще прервать работу основного алгоритма для подсчета времени или выполнения других действий, связанных с определенным моментом времени, чем дорабатывать алгоритм, что бы он мог сам подсчитывать время или отслеживать наступление определенного момента времени для выполнения нужной работы.

    Моё мнение: хотите извращений -- забудьте о прерываниях и никогда их не используйте. При определённом изврате от прерываний можно отказаться совсем.
     
    9xA59kK нравится это.
  3. ostrov

    ostrov Гуру

    Вообще то я имел ввиду ситуации когда можно сделать так и этак с одинакоаыми трудозатратами. Но все что вы написали это интересно, хотя Америку и не открывает.
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Странно вопрос поставлен. Прерывания - просто один из инструментов и этим инструментом нужно уметь пользоваться. Не нужно стараться сделать все на прерываниях и не нужно стараться сделать все без прерываний. Нужно стараться решить задачу, только и всего. Если задача проще решается с использованием прерываний - нужно их использовать.
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Тогда нужно выбирать тот способ, который больше нравится.
     
  6. Airbus

    Airbus Радиохулиган Модератор

    ЭЭЭ...И первый и второй. Иначе нельзя например при приёме данных-можно запросто потерять пакет.Где возможно-бывает что через прерывания можно сделать быстрее и проще.И вообще наСи многие программы написаны ТОЛЬКО на прерываниях главный цикл либо пустой либо тупое мигание.И кстати на Ассемблере также предпочтительней прерывания
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Иногда таки можно, аппаратную буферизацию придумали как раз для этого.
    При чем тут С? Контроллер прерываний - аппаратный модуль и он абсолютно никакого отношения к языку программирования не имеет.
     
  8. ostrov

    ostrov Гуру

    Я как то поднимал вопрос об аппаратной буферизации UART, выяснили, что там то ли 1 то ли 2 байта. То есть нужно моментально дублировать приходящие данные в программный буфер, иначе есть немалый шанс их растерять. Для этого вот, вероятно, лучше всего подходит прерывание. Или же мощно опрашивать буфер не дыша и не моргая. Впрочем, если позволяет кол-во памяти и настройки перфекционизма в душе, можно пользоваться структурой Serial, которая все это сделает за нас.
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    1 или 2 байта в уартах avr. А внешний уарт запросто может иметь буфер до 128 байт, а возможно и больше.
    А когда есть много потоков данных, которые нужно не прошляпить, берут сигнальный процессор или контроллер типа stm32 и вешают периферию на DMA, иначе на обработке каждого байта можно сожрать кучу времени.
     
    ostrov нравится это.
  10. AlexU

    AlexU Гуру

    Хорошо выяснили -- "то ли здесь, то ли завтра".
    Всё зависит от скорости последовательного порта. Если скорость будет максимальной (для ATmega328P на частоте 16МГц -- это 2 Мбит/с), то вероятность потерять пакет может быть и при использовании прерываний. А если скорость будет, например, 9600 бит/с, то на тех же 16МГц пройдёт >1500 тактов -- можно и диодами поморгать, и моторчиками покрутить, и без прерываний обойтись.
     
  11. Airbus

    Airbus Радиохулиган Модератор

    Речь идёт о Меге8/168/328?
    Ну по логике работы кода он проверяет есть ли что в УСАРТЕ?Нет возврат и снова-здорова.А это время.Хоть и небольшое.А тут по-любому сразу на приём-и в буфер и не обязательно в кольцевой.Да и потом а если в основном цЫкле надо что то делать например писать в ЕЕПРОМ?Тут уж точно без прерываний не обойтись.9600-хорошая скорость моя любимая кстати все мАбилы и шилды её любят и понимают.Тут можно и тупым переспросом ждать байт.А вот уже на 19200 фигушки.А опрос множества кнопок(датчиков)?Тут явно прерывания по изменению на любом из входов.Причём можно сразу вписать что сделать.
     
    Последнее редактирование: 4 апр 2016