ISR может установить источник для абсолютного времени. Это выполняется с помощью функции ssSetTimeSource. Функция ssSetTimeSource не может быть вызван раньше ssSetOutputPortWidth вызывается. Если это произойдет, программа остановится и выдаст сообщение об ошибке. ssSetTimeSource имеет следующие три варианта:
SS_TIMESOURCE_SELFКаждый сгенерированный ISR поддерживает свой собственный счетчик абсолютного времени, который отличается от периодической базовой скорости или счетчиков субскоростей в системе. Значение счетчика и значение разрешения таймера (заданное параметром блока Timer resolution (seconds) блока Async Interrupt) используются нисходящими блоками для определения абсолютных значений времени, требуемых вычислениями блока.
SS_TIMESOURCE_CALLER: ISR считывает время из счетчика, поддерживаемого его вызывающим абонентом. Таким образом, разрешение по времени совпадает с разрешением вызывающего абонента.
SS_TIMESOURCE_BASERATEИСР может считывать абсолютное время из периодической базовой ставки модели. Таким образом, разрешение по времени совпадает с разрешением по базовой скорости.
Примечание
Методы интеграции операционной системы, показанные в этом разделе, используют один или несколько блоков в vxlib1 библиотека. Эти блоки содержат начальные примеры, помогающие разрабатывать пользовательские блоки для целевой среды.
По умолчанию счетчик реализован как 32-разрядный беззнаковый целочисленный член Timing подструктура структуры модели в реальном времени. Для цели, поддерживающей rtModel структура данных, если тип временных данных не установлен с помощью ssSetAsyncTimeDataTypeразмер встречного слова определяется настройкой для параметра конфигурации модели Срок службы приложения (дней). В качестве примера (из целевого кода 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 структура данных, размер встречного слова определяется установкой параметра конфигурации модели Срок службы приложения (дней).
По умолчанию 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, либо сгенерировать код для считывания регистра таймера на целевом оборудовании.
Измените настройку параметра блока Разрешение по таймеру (секунды) для блока асинхронного прерывания, чтобы оно соответствовало разрешению источника синхронизации для целевого компьютера.
Счетчик обновляется на уровне прерывания. Его значение представляет деление источника синхронизации при последнем выполнении ISR. Скорость этого источника синхронизации не связана с частотой дискретизации в модели. На самом деле, обычно это быстрее, чем базовая скорость модели. Выберите источник таймера и установите его скорость и разрешение на основе ожидаемой скорости прерываний, которые будут обслуживаться блоком асинхронных прерываний.
Пример создания кода таймера см. в разделе Реализация блока асинхронных прерываний.