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

О 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 документации 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. (system является родительской системой блока вызова.) Видят, Генерируют Код для Счетчика Прошедшего времени для примера кода, сгенерированного этой функцией.

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

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

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

Похожие темы