Этот пример показывает, как оптимизировать объем памяти, который генератор кода выделяет для счетчиков времени. Пример оптимизирует память, которая хранит прошедшее время, интервал времени между двумя событиями.
Генератор кода представляет счетчики времени как беззнаковое целое. Размер слова счетчиков времени основан на установке образцовой продолжительности жизни Приложения параметра конфигурации (дни), который задает ожидаемую максимальную длительность времени выполнение приложения. Можно использовать этот параметр, чтобы предотвратить переполнение счетчика времени. Размер по умолчанию составляет 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 model: rtwdemo_abstime ### Successful completion of build procedure for model: rtwdemo_abstime
Рассмотрите сгенерированный код
Откройте сгенерированный исходный файл 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; /* 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_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 model: rtwdemo_abstime ### Successful completion of build procedure for model: rtwdemo_abstime
Рассмотрите регенерированный код
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; /* 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_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
Сопутствующая информация
Образцовые параметры конфигурации: оптимизация генерации кода (Simulink Coder)
Таймеры в асинхронных задачах (Simulink Coder)
Основанное на времени планирование и генерация кода (Simulink Coder)
Эта модель показывает генерацию кода для односкоростной модели дискретного времени, сконфигурированной для цели несмонтированной платы (один без операционной системы).
Открытая модель в качестве примера
Откройте модель rtwdemo_srbb
в качестве примера.
open_system('rtwdemo_srbb')
Модель использует один шаг расчета и сконфигурирована, чтобы отобразить цвета шага расчета, когда схема обновления происходит. Блоки In1_1s и In2_1s Inport задают 1 второй шаг расчета, который осуществляется образцовым параметром конфигурации Периодическое ограничение шага расчета. К ограничению шага расчета представления Periodic и связанным параметрам на панели Решателя диалогового окна Model Configuration Parameters, дважды кликните, желтая кнопка маркировала View Solver Configuration. Чтобы проверить использование одного шага расчета, дважды кликните, желтая кнопка маркировала Display Sample Time Colors. Поскольку модель сконфигурирована с одним шагом расчета, модель кажется красной, который является цветом, который представляет самый быстрый дискретный шаг расчета в модели.
Эта модель показывает код, сгенерированный для многоскоростной модели дискретного времени, сконфигурированной для однозадачности на цели несмонтированной платы (один без операционной системы).
Открытая модель в качестве примера
Откройте модель rtwdemo_mrstbb
в качестве примера.
open_system('rtwdemo_mrstbb')
Модель содержит два шага расчета. Блок 1 Inport и блок 2 Inport задают 1 второй и 2-секундный шаг расчета, соответственно, которые осуществляются Периодической ограничительной опцией шага расчета на странице настройки Решателя. Решатель установлен для однозадачной операции. Блоки перехода уровня, поэтому, не необходимы между блоками, выполняющимися в различных шагах расчета, потому что вытеснение не произойдет.
Модель сконфигурирована, чтобы отобразить цвета шага расчета после обновления схемы. Красный представляет самый быстрый дискретный шаг расчета в модели, зеленый представляет второе самое быстрое, и желтый представляет смешанные шаги расчета. Дважды кликните желтую кнопку в модели, чтобы обновить схему и показать цвета шага расчета.
Эта модель показывает код, сгенерированный для многоскоростной модели дискретного времени, сконфигурированной для многозадачной цели несмонтированной платы (один без операционной системы).
Открытая модель в качестве примера
Откройте модель rtwdemo_mrmtbb
в качестве примера.
open_system('rtwdemo_mrmtbb')
Исследуйте модель в качестве примера
Модель содержит два шага расчета. Блок 1 Inport и блок 2 Inport задают 1 второй и 2-секундный шаг расчета, соответственно, которые осуществляются Периодической ограничительной опцией шага расчета на странице настройки Решателя. Решатель установлен для многозадачной операции, что означает, что блок перехода уровня требуется, чтобы гарантировать, что целостность данных осуществляется, когда 1 вторая задача вытесняет 2 вторых задачи. Соответствующие переходы уровня всегда осуществляются Simulink и Simulink Coder. Эта модель задает явный блок перехода уровня. Также этот блок мог быть автоматически вставлен Simulink с помощью образцового параметра конфигурации, Автоматически обрабатывают переход уровня для передачи данных.
Модель сконфигурирована, чтобы отобразить цвета шага расчета после обновления схемы. Красный представляет самый быстрый дискретный шаг расчета в модели, зеленый представляет второе самое быстрое, и желтый представляет смешанные шаги расчета. Нажмите желтую кнопку к праву обновить схему и показать цвета шага расчета.
Предположения передачи данных
Основание операции для передач данных между задачами:
Переходы данных происходят между одной задачей считывания и одной задачей записи.
Чтение или запись измеренной переменной байта являются атомарными.
Когда две задачи взаимодействуют посредством перехода данных, только один из них может вытеснить другой.
Для периодических задач более быстрая задача уровня имеет более высокий приоритет, чем более медленная задача уровня; более быстрая задача уровня всегда вытесняет более медленную задачу уровня.
Все задачи работают на одном процессоре. Квантование времени не позволено.
Процессы не отказывают/перезапускают (особенно, в то время как данные передаются между задачами),
Эта модель показывает различия в режимах работы блока Rate Transition, когда используется в многоскоростной, многозадачной модели. Гибкие опции для блока Rate Transition позволяют вам выбирать режим, который подходит лучше всего для вашего приложения. Можно торговать уровнями детерминизма и целостности данных, чтобы улучшить производительность системы.
Блочные режимы перехода уровня операции
Обеспечьте целостность данных и детерминизм (DetAndInteg): Данные передаются таким образом, что все байты данных для сигнала (включая все элементы широкого сигнала) от того же временного шага. Кроме того, это обеспечено это относительный шаг расчета (задержка), от которой данные передаются от одного уровня до другого, всегда то же самое. Только ANSI-C используется, никакой целевой определенный 'критический раздел' защита не необходим.
Обеспечьте целостность (IntegOnly): Данные передаются таким образом, что все байты данных для сигнала (включая все элементы широкого сигнала) от того же временного шага. Однако от одной передачи данных к следующему, относительный шаг расчета (задержка), для которой передаются данные, может отличаться. В этом режиме коде к чтению-записи данные запускаются чаще, чем в режиме DetandInt. В худшем случае задержка эквивалентна режиму DetandInt, но задержка может быть меньше, который важен, некоторые приложения. Кроме того, эта поддержка режима передачи данных к/от асинхронным уровням, которые не может поддержать режим DetandInt. Только ANSI-C используется, никакой целевой определенный 'критический раздел' защита не необходим.
Никакие операции непротиворечивости данных не выполняются (Ни один): Для этого случая блок Rate Transition не делает сгенерированного кода. Этот режим приемлем в некотором приложении, где атомарный доступ скалярных типов данных гарантируется и когда относительные временные значения данных не будут важны. Этот режим не вводит задержки.
Предположения передачи данных
Основание операции для передач данных между задачами:
Переходы данных происходят между одной задачей считывания и одной задачей записи.
Чтение или запись измеренной переменной байта являются атомарными.
Когда две задачи взаимодействуют посредством перехода данных, только один из них может вытеснить другой.
Для периодических задач более быстрая задача уровня имеет более высокий приоритет, чем более медленная задача уровня; более быстрая задача уровня всегда вытесняет более медленную задачу уровня.
Все задачи работают на одном процессоре. Квантование времени не позволено.
Процессы не отказывают/перезапускают (особенно, в то время как данные передаются между задачами),
Образцовый rtwdemo_ratetrans
open_system('rtwdemo_ratetrans')
Образцовый rtwdemo_ratetrans
показывает различия в режимах работы следующих блоков Перехода Уровня.
Блок Rate Transition DetAndIntegF2S
Детерминизм и целостность данных (быстро, чтобы замедлить переход):
Блок вывод используется в качестве персистентного буфера данных.
Данные записаны, чтобы вывести на более медленном уровне, но сделанный во время более быстрого контекста уровня
Данные, как замечено более медленным уровнем всегда являются значением когда и быстрее и более медленный уровень, в последний раз выполняемый. Любые последующие шаги более быстрым уровнем (и сопоставленные обновления данных), в то время как более медленный уровень запускается, не замечены более медленным уровнем.
Блок Rate Transition DetAndIntegS2F
Детерминизм и целостность данных (замедляются к быстрому переходу):
Использование два персистентных буфера данных, внутренний буфер и блоки выводится.
Внутренний буфер скопирован в вывод на более медленном уровне, но сделан во время более быстрого контекста уровня.
Внутренний буфер записан на более медленном уровне и во время более медленного контекста уровня.
Данные, которые видит Высокая скорость, всегда задерживаются, т.е. данные от предыдущего шага кода низкой скорости.
Блок Rate Transition IntegOnlyF2S
Целостность данных только (быстро, чтобы замедлить переход):
Блок вывод используется в качестве персистентного буфера данных.
Данные записаны, чтобы буферизовать во время более быстрого контекста уровня, если флаг указывает на него не в процессе того, чтобы быть считанным.
Флаг установлен, и данные копируются с буфера, чтобы вывести на низкой скорости, флаг затем очищен. Это - дополнительная копия по сравнению с детерминированным случаем.
Данные, как замечено более медленным уровнем могут быть от более свежего шага более быстрого уровня, чем от когда более медленный уровень и более быстрый уровень оба выполняемые.
Блок Rate Transition IntegOnlyS2F
Целостность данных только (замедляются к быстрому переходу):
Использование два персистентных буфера данных, оба - внутренние буферы.
Один из 2 буферов всегда копируется в вывод на более быстром уровне.
Один из 2 буферов записан на более медленном уровне и во время более медленного контекста уровня, затем активный буфер переключается.
Данные, как замечено более быстрым уровнем могут быть более свежими, чем для детерминированного случая. А именно, когда и медленнее и более быстрый уровень будут иметь их хиты, более быстрый уровень будет видеть предыдущее значение от более медленного уровня. Но, последующие шаги для более быстрого уровня могут видеть обновленное значение (когда более медленный уровень обновляет неактивный буфер и переключает активный буферный флаг.
Блок Rate Transition NoneF2S
Никакой код не сгенерирован для блока Rate Transition, когда детерминизм и целостность данных отклонены.
Блок Rate Transition NoneS2F
Никакой код не сгенерирован для блока Rate Transition, когда детерминизм и целостность данных отклонены.
bdclose('rtwdemo_ratetrans');