В этом примере показано, как оптимизировать объем памяти, который генератор кода выделяет для счетчиков времени. Пример оптимизирует память, которая хранит прошедшее время, интервал времени между двумя событиями.
Генератор кода представляет счетчики времени как беззнаковое целое. Размер слова счетчиков времени основан на установке продолжительности жизни Приложения параметра конфигурации модели (дни), который задает ожидаемую максимальную длительность времени выполнение приложения. Можно использовать этот параметр, чтобы предотвратить переполнение счетчика времени. Размер по умолчанию составляет 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 11.526s
Рассмотрите сгенерированный код
Откройте сгенерированный исходный файл 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_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 7.039s
Рассмотрите регенерированный код
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_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
Сопутствующая информация
Эта модель показывает генерацию кода для односкоростной модели дискретного времени, сконфигурированной для цели несмонтированной платы (один без операционной системы).
Открытая модель в качестве примера
Откройте модель rtwdemo_srbb
в качестве примера.
open_system('rtwdemo_srbb')
Модель использует один шаг расчета и сконфигурирована, чтобы отобразить цвета шага расчета, когда схема обновления происходит. In1_1s Inport блоков и In2_1s задают 1 второй шаг расчета, который осуществляется установкой параметра конфигурации модели Периодическое ограничение шага расчета.
Модель сконфигурирована, чтобы отобразить шаги расчета, на которые наносят цветную маркировку, с аннотациями. Чтобы видеть их, после открытия модели, обновляют схему путем нажатия Ctrl+D. Чтобы отобразить легенду, нажмите Ctrl+J. Поскольку модель сконфигурирована с одним шагом расчета, модель кажется красной, который является цветом, который представляет самый быстрый дискретный шаг расчета в модели.
Эта модель показывает код, сгенерированный для многоскоростной модели дискретного времени, сконфигурированной для однозадачности на цели несмонтированной платы (один без операционной системы).
Открытая модель в качестве примера
Откройте модель rtwdemo_mrstbb
в качестве примера.
open_system('rtwdemo_mrstbb')
Модель содержит два шага расчета. Inport блок 1 и Inport блок 2 задают 1 второй и 2-секундный шаг расчета, соответственно, которые осуществляются установкой параметра конфигурации модели Периодическое ограничение шага расчета. Решатель установлен для однозадачной операции. Блоки перехода уровня, поэтому, не включены между блоками, выполняющимися в различных шагах расчета, потому что вытеснение не произойдет.
Модель сконфигурирована, чтобы отобразить шаги расчета, на которые наносят цветную маркировку, с аннотациями. Чтобы видеть их, после открытия модели, обновляют схему путем нажатия Ctrl+D. Чтобы отобразить легенду, нажмите Ctrl+J. Красный представляет самый быстрый дискретный шаг расчета в модели, зеленый представляет второе самое быстрое, и желтый представляет смешанные шаги расчета.
Эта модель показывает код, сгенерированный для многоскоростной модели дискретного времени, сконфигурированной для многозадачной цели несмонтированной платы (один без операционной системы).
Открытая модель в качестве примера
Откройте модель rtwdemo_mrmtbb
в качестве примера.
open_system('rtwdemo_mrmtbb')
Исследуйте модель в качестве примера
Модель содержит два шага расчета. Inport блок 1 и Inport блок 2 задают 1 второй и 2-секундный шаг расчета, соответственно, которые осуществляются установкой параметра конфигурации модели Периодическое ограничение шага расчета. Решатель установлен для многозадачной операции, что означает, что блок перехода уровня требуется, чтобы гарантировать, что целостность данных осуществляется, когда 1 вторая задача вытесняет 2 вторых задачи. Соответствующие переходы уровня всегда осуществляются Simulink и Simulink Coder. Эта модель задает явный блок перехода уровня. В качестве альтернативы этот блок мог быть автоматически вставлен параметром конфигурации модели установки Simulink, Автоматически обрабатывают переход уровня для передачи данных.
Модель сконфигурирована, чтобы отобразить цвета шага расчета после обновления схемы. Чтобы видеть их, после открытия модели, обновляют схему путем нажатия Ctrl+D. Чтобы отобразить легенду, нажмите Ctrl+J. Красный представляет самый быстрый дискретный шаг расчета в модели, зеленый представляет второе самое быстрое, и желтый представляет смешанные шаги расчета.
Предположения передачи данных
Базис операции для передач данных между задачами:
Переходы данных находятся между одной задачей считывания и одной задачей записи.
Чтение или запись измеренной переменной байта являются атомарными.
Когда две задачи взаимодействуют посредством перехода данных, только один из них может вытеснить другой.
Для периодических задач более быстрая задача уровня имеет более высокий приоритет, чем более медленная задача уровня; более быстрая задача уровня всегда вытесняет более медленную задачу уровня.
Задачи работают на одном процессоре. Квантование времени не позволено.
Процессы не разрушают и перезапускают (особенно, в то время как данные передаются между задачами),
Этот пример генерирует код для многоскоростной модели дискретного времени, сконфигурированной для цели многозадачной операционной системы (VxWorks®). Модель содержит два шага расчета. Inport блок 1 и Inport блок 2 задают 1 второй и 2-секундный шаг расчета, соответственно, которые осуществляются установкой параметра конфигурации модели Периодическое ограничение шага расчета. Решатель установлен для многозадачной операции, что означает, что блок Rate Transition требуется, чтобы гарантировать, что целостность данных осуществляется, когда 1 вторая задача вытесняет 2 вторых задачи. Simulink® и генератор кода осуществляют соответствующие переходы уровня. Эта модель задает явный блок Rate Transition. В качестве альтернативы можно сообщить, что Simulink®, чтобы вставить этот блок для вас путем установки параметра конфигурации модели Автоматически обрабатывает переход уровня для передачи данных.
Модель сконфигурирована, чтобы отобразить шаги расчета, на которые наносят цветную маркировку, с аннотациями. Чтобы видеть их, после открытия модели, обновляют схему путем нажатия Ctrl+D. Чтобы отобразить легенду, нажмите Ctrl+J. Красный представляет самый быстрый дискретный шаг расчета в модели, зеленый представляет второе самое быстрое, и желтый представляет смешанные шаги расчета.
Модель в качестве примера
model = 'rtwdemo_mrmtos';
open_system(model);
Эта модель показывает различия в режимах работы блока 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
Детерминизм и целостность данных (замедляются к быстрому переходу):
Использование два персистентных буфера данных, внутренний буфер и блоки выводится.
Внутренний буфер скопирован в выход на более медленном уровне, но сделан во время более быстрого контекста уровня.
Внутренний буфер записан на более медленном уровне и во время более медленного контекста уровня.
Данные, которые видит Высокая скорость, всегда задерживаются, i.e. данные от предыдущего шага кода низкой скорости.
Блок Rate Transition IntegOnlyF2S
Целостность данных только (быстро, чтобы замедлить переход):
Блок выход используется в качестве персистентного буфера данных.
Данные записаны, чтобы буферизовать во время более быстрого контекста уровня, если флаг указывает на него не в процессе того, чтобы быть считанным.
Флаг установлен, и данные копируются с буфера, чтобы вывести на низкой скорости, флаг затем очищен. Это - дополнительная копия по сравнению с детерминированным случаем.
Данные, как замечено более медленным уровнем могут быть от более свежего шага более быстрого уровня, чем от когда более медленный уровень и более быстрый уровень оба выполняемые.
Блок Rate Transition IntegOnlyS2F
Целостность данных только (замедляются к быстрому переходу):
Использование два персистентных буфера данных, оба - внутренние буферы.
Один из 2 буферов всегда копируется в выход на более быстром уровне.
Один из 2 буферов записан на более медленном уровне и во время более медленного контекста уровня, затем активный буфер переключается.
Данные, как замечено более быстрым уровнем могут быть более свежими, чем для детерминированного случая. А именно, когда и медленнее и более быстрый уровень будут иметь их хиты, более быстрый уровень будет видеть предыдущее значение от более медленного уровня. Но, последующие шаги для более быстрого уровня могут видеть обновленное значение (когда более медленный уровень обновляет неактивный буфер и переключает активный буферный флаг.
Блок Rate Transition NoneF2S
Никакой код не сгенерирован для блока Rate Transition, когда детерминизм и целостность данных отклонены.
Блок Rate Transition NoneS2F
Никакой код не сгенерирован для блока Rate Transition, когда детерминизм и целостность данных отклонены.
bdclose('rtwdemo_ratetrans');