Доступ к таймерам программно

О API таймера

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

  • Чтобы сгенерировать и использовать новые таймеры, аналогичные описанному выше, ваши S-функции должны указать потребность использовать абсолютный или прошедший таймер путем вызова ssSetNeedAbsoluteTime или ssSetNeedElapseTime \in 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 документации 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 Function Library Reference документации Компилятора Выходного языка.

    Примечание

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

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

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

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

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

Похожие темы