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