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

Об 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)

TLC API для генерации кода

Следующие функции 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 является родительской системой блока вызова.)

Похожие темы