Где поставить расчеты? Внутри обработчик прерываний или основной цикл? (встроенное приложение реального времени) - PullRequest
2 голосов
/ 08 марта 2012

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

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

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

Ответы [ 4 ]

3 голосов
/ 08 марта 2012

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

2 голосов
/ 08 марта 2012

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

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

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

1 голос
/ 08 марта 2012

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

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

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

0 голосов
/ 09 марта 2012

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

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