Эта тема описывает 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 документации 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 Function Library Reference документации Компилятора Выходного языка.
Не используйте LibGetT
с этой целью. LibGetT
всегда читает базовую ставку (tid 0
) таймер. Если LibGetT
называется для блока, выполняющегося на подуровне, неправильный таймер читается, вызывая серьезные ошибки.
LibGetElapseTime
(system)
: Генерирует код, чтобы считать счетчик прошедшего времени для system
. (system
является родительской системой блока вызова.) Видят, Генерируют Код для Счетчика Прошедшего времени для примера кода, сгенерированного этой функцией.
LibGetElapseTimeCounter
(system)
: Генерирует код, чтобы считать целочисленное значение счетчика прошедшего времени для system
. (system
является родительской системой блока вызова.) Эта функция должна использоваться в сочетании с LibGetElapseTimeCounterDtypeId
и LibGetElapseTimeResolution
. (См. обсуждение ssGetElapseTimeCounter
выше.)
LibGetElapseTimeCounterDtypeId
(system)
: Генерирует код, который возвращает тип данных счетчика прошедшего времени для system
. (system
является родительской системой блока вызова.)
LibGetElapseTimeResolution
(system)
: Генерирует код, который возвращает разрешение счетчика прошедшего времени для system
. (system
является родительской системой блока вызова.)