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.
Для примера генерации кода таймера смотрите Асинхронную Реализацию Блока Прерывания.