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

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

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

Количество бит, которые использует счетчик времени, зависит от настройки параметра Application lifespan (days). Для примера, если счетчик времени шагов со скоростью 1 кГц, чтобы избежать переполнения, счетчик имеет следующее количество бит:

  • Продолжительность жизни < 0.25 сек: 8 бит

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

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

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

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

Откройте модель примера

Откройте пример модели rtwdemo_abstime.

Модель состоит из трех подсистем SS1, SS2, и SS3. На панели Math and Data Types параметр Application lifespan (days) установлен на значение по умолчанию, которое inf.

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

  • SS1 - Тактовая частота 1 кГц. Не требует счетчика времени. Шагу расчета type для порта триггера задано значение 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_ */

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

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

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

Связанная информация

Похожие темы