exponenta event banner

Программные таймеры доступа

Об API таймера

В этом разделе описываются интерфейсы API, которые позволяют S-функциям использовать преимущества эффективности, обеспечиваемой абсолютными и истекшими таймерами. Макросы SimStruct предоставляются для использования в моделировании, а функции TLC - для генерации встроенного кода. Обратите внимание, что

  • Для генерации и использования новых таймеров, как описано выше, S-функции должны зарегистрировать необходимость использования абсолютного или истекшего таймера путем вызова ssSetNeedAbsoluteTime или ssSetNeedElapseTime в mdlInitializeSampleTime.

  • Существующие S-функции, считывающие абсолютное время, но не регистрируемые с помощью этих макросов, продолжают работать так, как ожидалось, но генерируют менее эффективный код.

C API для 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)

API TLC для создания кода

Следующие функции TLC поддерживают счетчики времени в сгенерированном коде при встраивании S-функций путем написания для них сценариев TLC.

  • LibGetTaskTimeFromTID(block): Создает код для считывания абсолютного времени для задачи, в которой block выполняется.

    LibGetTaskTimeFromTID задокументирован с другими временными функциями-образцами на справочных страницах библиотеки функций TLC в документации компилятора целевого языка.

    Примечание

    Не использовать LibGetT с этой целью. LibGetT всегда считывает базовую ставку (tid 0) таймер. Если LibGetT вызывается для блока, выполняющегося на субскоростях, считывается неверный таймер, что приводит к серьезным ошибкам.

  • LibGetElapseTime(system): Создает код для считывания счетчика прошедшего времени для system. (system - родительская система вызывающего блока.) Пример кода, сгенерированного этой функцией, см. в разделе Создание кода для счетчика прошедшего времени.

  • LibGetElapseTimeCounter(system): Создает код для считывания целочисленного значения счетчика прошедшего времени для system. (system - родительская система вызывающего блока.) Эта функция должна использоваться совместно с LibGetElapseTimeCounterDtypeId и LibGetElapseTimeResolution. (См. обсуждение ssGetElapseTimeCounter выше.)

  • LibGetElapseTimeCounterDtypeId(system): Создает код, возвращающий тип данных счетчика прошедшего времени для system. (system - родительская система вызывающего блока.)

  • LibGetElapseTimeResolution(system): Создает код, возвращающий разрешение счетчика прошедшего времени для system. (system - родительская система вызывающего блока.)

Связанные темы