Куда поставить расчеты? Внутренний обработчик прерывания или основной цикл? (встроенное приложение реального времени)

Я разрабатываю встроенное приложение для управления двигателем, и я сомневаюсь, что делать с некоторыми вычислениями, которые преобразуют числовые значения АЦП в физические значения со знаком (амперы).

Должен ли я производить вычисления в обработчике прерывания или я должен просто использовать обработчик для установки глобального флага и производить вычисления в основном цикле, когда флаг установлен?

Заранее спасибо.


person Hungi Mahar    schedule 07.03.2012    source источник


Ответы (4)


На этот вопрос нет универсального ответа. Это зависит от ваших требований к времени, существующей нагрузки прерывания и т. Д.

Если это довольно простое умножение или что-то в этом роде, я бы просто сделал это в прерывании и двинулся дальше.

Просто убедитесь, что вы знаете, что делаете, и не тратите больше времени на прерывание, чем следовало бы.

person Kyle Heironimus    schedule 07.03.2012

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

person Carl Norum    schedule 07.03.2012
comment
Абсолютно. Однако при реализации основных потоков и семафоров не так много накладных расходов, и это может серьезно упростить процесс программирования. - person Carl Norum; 08.03.2012
comment
@Carl, возможно, вы могли бы развить свою идею использования семафоров и потоков и того, как это упрощает программирование, потому что, как я это вижу, поскольку мое приложение уже довольно сложно, адаптация к нему rtos на этом этапе кажется пугающей. - person Hungi Mahar; 08.03.2012
comment
Если ваше приложение сложное, оно идеально подходит для крошечного руководителя, работающего в режиме реального времени. У вас может быть, например, поток, который обрабатывает данные ADC и обычно блокируется семафором. Затем, когда срабатывает ваше прерывание, вы можете получить сигнал обработчика прерывания от этого семафора, чтобы разбудить задачу ADC и заставить ее выполнять свою работу. - person Carl Norum; 08.03.2012
comment
Я согласен с Карлом, если ваше приложение довольно сложное, это, вероятно, означает, что вам с самого начала следовало использовать облегченную ОС. Возможно, вам стоит взглянуть на uCOS-II (micrium.com/page/products/rtos/ os-ii), он бесплатный / с открытым исходным кодом, очень маленький и простой, но дает вам такие основы, как семафоры, таймеры и упреждение задач. - person TJD; 08.03.2012
comment
uCOS-II не является бесплатным или открытым исходным кодом. На их веб-сайте встроенные компоненты Micrium оцениваются как отдельные модули или как комплексные решения. Пожалуйста, свяжитесь с Micriµm для получения полной информации о ценах в соответствии с вашими конкретными требованиями. - person uɐɪ; 09.03.2012
comment
Условия моего проекта не позволяют мне использовать RTOS (бесплатно или иначе) или любой другой сторонний код, который был написан не мной. Есть ли способ реализовать концепции RTOS в минималистичном стиле? - person Hungi Mahar; 10.03.2012

Это зависит от того, что вы хотите делать со значениями АЦП и насколько быстро вам нужно это делать. Если вам нужно предпринять какое-то критичное по времени действие на основе значений АЦП, вы должны иметь дело с этим в прерывании. Однако, если это так, чтобы сэкономить деньги на первом вычислении «реального» аналогового значения из счетчиков АЦП, вы должны просто выразить свои критические пороги в терминах счетчиков АЦП.

Например, если ваш АЦП выдает 8 отсчетов на вольт, и вам нужно запустить аварийный останов, если АЦП сообщает о более чем 1,5 вольта, вы пишете код прерывания, чтобы сработать аварийный останов при 12 отсчетах. Затем вы все равно можете передать отсчет АЦП в основной цикл для перевода в удобные для пользователя единицы для целей пользовательского интерфейса и т. Д.

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

person Sam Skuce    schedule 07.03.2012

Одна вещь, о которой следует подумать, - это согласованность данных. Если вы получаете несколько связанных значений от АЦП (положение, напряжение, ток и т. Д.), Вы можете сделать что-то, чтобы убедиться, что вы работаете с согласованным набором. Это может означать, что фоновое обновление лучше, чем обновление в ISR. Даже согласованность одного показания для данного прохода алгоритма может быть важной. Рассмотрим этот фоновый код.

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now
person AShelly    schedule 09.03.2012