Таймеры в асинхронных задачах

ISR может задать источник для абсолютного времени. Это делается с помощью функции ssSetTimeSource. Функция ssSetTimeSource не может быть вызван раньше ssSetOutputPortWidth вызывается. Если это происходит, программа останавливается и генерирует сообщение об ошибке. ssSetTimeSource имеет следующие три опции:

  • SS_TIMESOURCE_SELF: Каждый сгенерированный ISR поддерживает свой собственный абсолютный счетчик времени, который отличается от периодической базовой ставки или счетчиков субрейта в системе. Значение счетчика и значение разрешения таймера (заданное с помощью параметров блоков Timer resolution (seconds) блока Async Interrupt) используются нисходящими блоками для определения абсолютных значений времени, требуемых блоком расчетов.

  • SS_TIMESOURCE_CALLER: ISR считывает время с счетчика, поддерживаемого вызывающим абонентом. Таким образом, разрешение по времени совпадает с разрешением вызывающего абонента.

  • SS_TIMESOURCE_BASERATE: ISR может считать абсолютное время из периодической базовой ставки модели. Таким образом, разрешение по времени совпадает с разрешением по базовой ставке.

Примечание

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

По умолчанию счетчик реализован как 32-битный беззнаковый целочисленный представитель Timing подструктура структуры модели реального времени. Для целевого объекта, который поддерживает rtModel структура данных, когда тип данных времени не установлен при помощи ssSetAsyncTimeDataTypeразмер слова счетчика определяется настройкой для параметра конфигурации <reservedrangesplaceholder0> модели. В качестве примера (из целевого кода ERT),

/* Real-time Model Data Structure */
struct _RT_MODEL_elapseTime_exp_Tag {
   const char *errorStatus;
  
  /*
   * Timing:
   * The following substructure contains information regarding
   * the timing information for the model.
   */
  struct {
    uint32_T clockTick1;
    uint32_T clockTick2;
  } Timing;
};

Пример опускает неиспользованные поля в Timing структура данных (функция целевого кода ERT, не найденная в GRT). Для целевого объекта, который поддерживает rtModel структура данных, размер слова счетчика определяется настройкой параметра конфигурации <reservedrangesplaceholder0> модели.

По умолчанию в vxlib1 библиотечные блоки для примера RTOS (VxWorks®) установите источник таймера равным SS_TIMESOURCE_SELF и обновляйте счетчики при помощи системного вызова tickGet. tickGet возвращает значение таймера, поддерживаемое ядром RTOS. Максимальный размер слова для таймера UINT32. В следующем примере показан сгенерированный вызов на tickGet.

/* VxWorks Interrupt Block: '<Root>/Async Interrupt' */
void isr_num2_vec193(void)
{

 /* Use tickGet() as a portable tick counter example. A much
    higher resolution can be achieved with a hardware counter */
 rtM->Timing.clockTick2 = tickGet();
. . .

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

Измените настройку параметров блоков Timer resolution (seconds) блока Async Interrupt так, чтобы она совпадала с разрешением источника синхронизации для целевого компьютера.

Счетчик обновляется на уровне прерывания. Его значение представляет значение деления источника синхронизации при последнем выполнении ISR. Скорость этого источника синхронизации не связана с частотой дискретизации в модели. На самом деле, обычно это быстрее, чем базовая ставка модели. Выберите источник таймера и установите его скорость и разрешение на основе ожидаемой скорости прерываний, которые будут обслуживаться блоком Async Interrupt.

Пример генерации кода таймера см. в разделе Реализация блока асинхронного прерывания.

Похожие примеры

Подробнее о