В этом разделе описываются API, которые позволяют вашим S-функциям использовать преимущества эффективности, предлагаемые абсолютными и прошедшими таймерами. Для использования в симуляции предусмотрены макросы SimStruct, а для встроенной генерации кода предусмотрены функции TLC. Обратите внимание, что
Чтобы сгенерировать и использовать новые таймеры, как описано выше, ваши S-функции должны зарегистрировать необходимость использования абсолютного или истекшего таймера путем вызова ssSetNeedAbsoluteTime
или ssSetNeedElapseTime
в mdlInitializeSampleTime
.
Существующие S-функции, которые считывают абсолютное время, но не регистрируются при помощи этих макросов, продолжают работать, как ожидалось, но генерируют менее эффективный код.
Макросы SimStruct, описанные в этой теме, обеспечивают доступ к абсолютным и прошедшим таймерам для S-функций во время симуляции.
В функциях ниже, SimStruct *S
аргумент является указателем на simstruct
от вызова S-функции.
void ssSetNeedAbsoluteTime(SimStruct *S, boolean b)
: если b
является TRUE
, регистрирует, что вызывающая S-функция требует абсолютных временных данных, и выделяет абсолютный временной счетчик для скорости, с которой выполняет S-функция (если такой счетчик еще не был выделен).
int ssGetNeedAbsoluteTime(SimStruct *S)
: возвращает 1, если S-функция зарегистрировала, что это требует абсолютного времени.
double ssGetTaskTime(SimStruct *S, tid)
: считайте абсолютное время для заданной задачи с идентификатором задачи tid
. ssGetTaskTime
работает прозрачно, независимо от того, используете ли вы новые функции таймера. ssGetTaskTime
задокументировано в главе SimStruct Functions в Simulink® документация.
void ssSetNeedElapseTime(SimStruct *S, boolean b)
: если b
является TRUE
регистрирует, что вызывающая S-функция требует истекших временных данных, и выделяет счетчик истекшего времени для триггируемой подсистемы, в которой выполняется S-функция (если такой счетчик еще не был выделен). См. также раздел «Счетчики истекшего времени в триггируемых подсистемах».
int ssGetNeedElapseTime(SimStruct *S)
: возвращает 1, если S-функция зарегистрировала, что это требует истекшего времени.
void ssGetElapseTime(SimStruct *S, (double *)elapseTime)
: возвращается, в место, на которое указывает elapseTime
, значение (как double
) счетчика истекшего времени, сопоставленного с S-функцией.
void ssGetElapseTimeCounterDtype(SimStruct *S, (int *)dtype)
: возвращает тип данных счетчика истекшего времени, сопоставленного с S-функцией, в местоположение, на которое указывает dtype
. Эта функция предназначена для использования с ssGetElapseTimeCounter
функция (см. ниже).
void ssGetElapseResolution(SimStruct *S, (double *)resolution)
: возвращает разрешение (то есть шаг расчета) счетчика истекшего времени, сопоставленного с S-функцией, в местоположение, на которое указывает resolution
. Эта функция предназначена для использования с ssGetElapseTimeCounter
функция (см. ниже).
void ssGetElapseTimeCounter(SimStruct *S, (void *)elapseTime)
Эта функция предусмотрена для использования блоков, которые требуют истекших значений времени для расчетов с фиксированной точкой. ssGetElapseTimeCounter
возвращается, в место, на которое указывает elapseTime
, целочисленное значение прошедшего счетчика времени, сопоставленное с S-функцией. Если размер счетчика составляет 64 бита, значение возвращается как массив из двух 32-битных слов, причем слово низкого порядка сохранено по нижнему адресу.
Чтобы определить, как получить доступ к возвращенному значению счетчика, получите тип данных счетчика путем вызова ssGetElapseTimeCounterDtype
, как в следующем коде:
int *y_dtype; ssGetElapseTimeCounterDtype(S, y_dtype); switch(*y_dtype) { case SS_DOUBLE_UINT32: { uint32_T dataPtr[2]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_UINT32: { uint32_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_UINT16: { uint16_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_UINT8: { uint8_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_DOUBLE: { real_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; default: ssSetErrorStatus(S, "Invalid data type for elaspe time counter"); break; }
Если необходимо использовать фактическое истекшее время, выполните вызов на ssGetElapseTime
функция для прямого доступа к истекшему времени. Вам не нужно получать значение счетчика и затем вычислять истекшее время.
double *y_elapseTime; . . . ssGetElapseTime(S, elapseTime)
Следующие функции TLC поддерживают прошедшие счетчики времени в сгенерированном коде, когда вы строите S-функции, записывая для них TLC скрипты.
LibGetTaskTimeFromTID
(block)
: Генерирует код, чтобы считать абсолютное время для задачи, в которой block
выполняет.
LibGetTaskTimeFromTID
документируется другими функциями шага расчета в Страницы с описанием библиотеки функций TLC документации Target Language Compiler.
Примечание
Не используйте LibGetT
с этой целью. LibGetT
всегда читает базовую ставку (tid 0
) таймер. Если LibGetT
вызывается блок, выполняемый в субрейте, считывается неправильный таймер, вызывающий серьезные ошибки.
LibGetElapseTime
(system)
: Генерирует код, чтобы считать истекший счетчик времени для system
. (system
является родительской системой блока вызова.) Пример кода, сгенерированного этой функцией, см. в разделе Сгенерировать код для счетчика истекшего времени.
LibGetElapseTimeCounter
(system)
: Генерирует код, чтобы считать целое значение прошедшего счетчика времени для system
. (system
является родительской системой блока вызова.) Эта функция должна использоваться в сочетании с LibGetElapseTimeCounterDtypeId
и LibGetElapseTimeResolution
. (См. обсуждение ssGetElapseTimeCounter
выше.)
LibGetElapseTimeCounterDtypeId
(system)
: Генерирует код, который возвращает тип данных прошедшего счетчика времени для system
. (system
является родительской системой блока вызова.)
LibGetElapseTimeResolution
(system)
: Генерирует код, который возвращает разрешение прошедшего счетчика времени для system
. (system
является родительской системой блока вызова.)