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

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, встречный размер слова определяется установкой для параметра конфигурации модели Application lifespan (days) (Simulink). Как пример (от 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 структура данных, встречный размер слова определяется установкой параметра конфигурации модели Application lifespan (days) (Simulink).

По умолчанию, 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.

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

Связанные примеры

Больше о