Оптимизируйте использование памяти для счетчиков времени

В этом примере показано, как оптимизировать объем памяти, который генератор кода выделяет для счетчиков времени. Пример оптимизирует память, которая хранит прошедшее время, интервал времени между двумя событиями.

Генератор кода представляет счетчики времени как беззнаковое целое. Размер слова счетчиков времени основан на установке продолжительности жизни Приложения параметра конфигурации модели (дни), который задает ожидаемую максимальную длительность времени выполнение приложения. Можно использовать этот параметр, чтобы предотвратить переполнение счетчика времени. Размер по умолчанию составляет 64 бита.

Количество битов, что счетчик времени использование зависит от установки продолжительности жизни Приложения (дни) параметр. Например, если счетчик времени постепенно увеличивается на уровне 1 кГц, чтобы избежать переполнения, счетчик имеет следующее количество битов:

  • Продолжительность жизни <0,25 секунды: 8 битов

  • Продолжительность жизни <1 min: 16 битов

  • Продолжительность жизни <49 дней: 32 бита

  • Продолжительность жизни> 50 дней: 64 бита

64-битный счетчик времени не переполняется в течение 590 миллионов лет.

Открытая модель в качестве примера

Откройте модель rtwdemo_abstime в качестве примера.

Модель состоит из трех подсистем SS1, SS2, и SS3. На Математике и панели Типов данных, продолжительность жизни Приложения (дни) параметр устанавливается на значение по умолчанию, которое является inf.

Эти три подсистемы содержат интегратор дискретного времени, который требует, чтобы прошедшее время, как введено вычислило свое выходное значение. Подсистемы варьируются можно следующим образом:

  • SS1 - Синхронизированный на уровне 1 кГц. Не требует счетчика времени. Параметр типа шага расчета для триггерного порта устанавливается на periodic. Прошедшее время встраивается как 0,001.

  • SS2 - Синхронизированный на уровне 100 Гц. Требует счетчика времени. На основе продолжительности жизни 1 дня 32-битный счетчик хранит прошедшее время.

  • SS3 - Синхронизированный на уровне 0,5 Гц. Требует счетчика времени. На основе продолжительности жизни 1 дня 16-битный счетчик хранит прошедшее время.

Симулируйте модель

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

Сгенерируйте код и отчет

1. Создайте временную папку для сборки и инспекционного процесса.

2. Сконфигурируйте модель для генератора кода, чтобы использовать системный конечный файл GRT и продолжительность жизни inf дни.

3. Создайте модель.

### Starting build procedure for: rtwdemo_abstime
### Successful completion of build procedure for: rtwdemo_abstime

Build Summary

Top model targets built:

Model            Action                       Rebuild Reason                                    
================================================================================================
rtwdemo_abstime  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 8.839s

Рассмотрите сгенерированный код

Откройте сгенерированный исходный файл rtwdemo_abstime.c.

struct tag_RTM_rtwdemo_abstime_T {
  const char_T *errorStatus;

  /*
   * Timing:
   * The following substructure contains information regarding
   * the timing information for the model.
   */
  struct {
    uint32_T clockTick1;
    uint32_T clockTickH1;
    uint32_T clockTick2;
    uint32_T clockTickH2;
    struct {
      uint16_T TID[3];
      uint16_T cLimit[3];
    } TaskCounters;
  } Timing;
};

/* Block states (default storage) */
extern DW_rtwdemo_abstime_T rtwdemo_abstime_DW;

/* Zero-crossing (trigger) state */
extern PrevZCX_rtwdemo_abstime_T rtwdemo_abstime_PrevZCX;

/* External inputs (root inport signals with default storage) */
extern ExtU_rtwdemo_abstime_T rtwdemo_abstime_U;

/* External outputs (root outports fed by signals with default storage) */
extern ExtY_rtwdemo_abstime_T rtwdemo_abstime_Y;

/* Model entry point functions */
extern void rtwdemo_abstime_initialize(void);
extern void rtwdemo_abstime_step0(void);
extern void rtwdemo_abstime_step1(void);
extern void rtwdemo_abstime_step2(void);
extern void rtwdemo_abstime_step(int_T tid);
extern void rtwdemo_abstime_terminate(void);

/* Real-time Model object */
extern RT_MODEL_rtwdemo_abstime_T *const rtwdemo_abstime_M;

/*-
 * The generated code includes comments that allow you to trace directly
 * back to the appropriate location in the model.  The basic format
 * is <system>/block_name, where system is the system number (uniquely
 * assigned by Simulink) and block_name is the name of the block.
 *
 * Use the MATLAB hilite_system command to trace the generated code back
 * to the model.  For example,
 *
 * hilite_system('<S3>')    - opens system 3
 * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
 *
 * Here is the system hierarchy for this model
 *
 * '<Root>' : 'rtwdemo_abstime'
 * '<S1>'   : 'rtwdemo_abstime/SS1'
 * '<S2>'   : 'rtwdemo_abstime/SS2'
 * '<S3>'   : 'rtwdemo_abstime/SS3'
 */
#endif                                 /* RTW_HEADER_rtwdemo_abstime_h_ */

Четыре 32-битного беззнакового целого, clockTick1 , clockTickH1 , clockTick2 , и clockTickH2 счетчики для хранения прошедшего времени подсистем SS2 и SS3.

Включите оптимизацию и регенерируйте код

1. Реконфигурируйте модель, чтобы установить продолжительность жизни на 1 день.

2. Создайте модель.

### Starting build procedure for: rtwdemo_abstime
### Successful completion of build procedure for: rtwdemo_abstime

Build Summary

Top model targets built:

Model            Action                       Rebuild Reason                     
=================================================================================
rtwdemo_abstime  Code generated and compiled  Incremental checksum has changed.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 5.6438s

Рассмотрите регенерированный код

struct tag_RTM_rtwdemo_abstime_T {
  const char_T *errorStatus;

  /*
   * Timing:
   * The following substructure contains information regarding
   * the timing information for the model.
   */
  struct {
    uint32_T clockTick1;
    uint16_T clockTick2;
    struct {
      uint16_T TID[3];
      uint16_T cLimit[3];
    } TaskCounters;
  } Timing;
};

/* Block states (default storage) */
extern DW_rtwdemo_abstime_T rtwdemo_abstime_DW;

/* Zero-crossing (trigger) state */
extern PrevZCX_rtwdemo_abstime_T rtwdemo_abstime_PrevZCX;

/* External inputs (root inport signals with default storage) */
extern ExtU_rtwdemo_abstime_T rtwdemo_abstime_U;

/* External outputs (root outports fed by signals with default storage) */
extern ExtY_rtwdemo_abstime_T rtwdemo_abstime_Y;

/* Model entry point functions */
extern void rtwdemo_abstime_initialize(void);
extern void rtwdemo_abstime_step0(void);
extern void rtwdemo_abstime_step1(void);
extern void rtwdemo_abstime_step2(void);
extern void rtwdemo_abstime_step(int_T tid);
extern void rtwdemo_abstime_terminate(void);

/* Real-time Model object */
extern RT_MODEL_rtwdemo_abstime_T *const rtwdemo_abstime_M;

/*-
 * The generated code includes comments that allow you to trace directly
 * back to the appropriate location in the model.  The basic format
 * is <system>/block_name, where system is the system number (uniquely
 * assigned by Simulink) and block_name is the name of the block.
 *
 * Use the MATLAB hilite_system command to trace the generated code back
 * to the model.  For example,
 *
 * hilite_system('<S3>')    - opens system 3
 * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
 *
 * Here is the system hierarchy for this model
 *
 * '<Root>' : 'rtwdemo_abstime'
 * '<S1>'   : 'rtwdemo_abstime/SS1'
 * '<S2>'   : 'rtwdemo_abstime/SS2'
 * '<S3>'   : 'rtwdemo_abstime/SS3'
 */
#endif                                 /* RTW_HEADER_rtwdemo_abstime_h_ */

Новая установка для продолжительности жизни Приложения (дни) параметр дает генератору кода команду откладывать меньше памяти для счетчиков времени. Регенерированный код включает:

  • 32-битное беззнаковое целое, clockTick1, для хранения прошедшего времени задачи для SS2

  • 16-битное беззнаковое целое, clockTick2, для хранения прошедшего времени задачи для SS3

Сопутствующая информация

Похожие темы