文档

基于时间的调度示例模型

优化时间计数器的内存使用

这个例子展示了如何优化代码生成器分配给时间计数器的内存量。该示例优化了存储运行时间(两个事件之间的时间间隔)的内存。

代码生成器将时间计数器表示为无符号整数。时间计数器的字大小取决于模型配置参数的设置应用程序寿命(天),它指定应用程序运行的预期最长持续时间。可以使用此参数防止时间计数器溢出。默认大小是64位。

的设置决定了时间计数器使用的比特数应用程序寿命(天)参数。例如,如果一个时间计数器以1khz的速率递增,为了避免溢出,该计数器有以下位数:

  • 寿命< 0.25秒:8位

  • 寿命< 1min: 16位

  • 寿命< 49天:32位

  • 寿命> 50天:64位

64位的时间计数器5.9亿年都不会溢出。

开放范例模型

打开示例模型rtwdemo_abstime

该模型由三个子系统组成魔法石,第1章SS2,SS3.在数学和数据类型窗格中,应用程序寿命(天)参数设置为默认值,即

这三个子系统包含一个离散时间积分器,它需要运行时间作为输入来计算输出值。各子系统分别为:

  • SS1 - 1khz。不需要时间计数器。采样时间类型触发端口参数设置为周期.运行时间内联为0.001。

  • SS2 - 100hz时钟。需要时间计数器。基于1天的生命周期,32位计数器存储运行时间。

  • SS3 -时钟为0.5 Hz。需要时间计数器。基于1天的寿命,16位计数器存储运行时间。

模拟模型

模拟模型。默认情况下,模型被配置为以不同的颜色显示样本时间。三个子系统的离散抽样时间显示为红色、绿色和蓝色。被触发的子系统是蓝绿色的。

生成代码和报告

1.为构建和检查过程创建一个临时文件夹。

2.为代码生成器配置模型,以使用GRT系统目标文件和生命周期为天。

3.构建模型。

已成功完成模型:rtwdemo_abstime的构建过程

检查生成的代码

打开生成的源文件rtwdemo_abstime.c

struct tag_RTM_rtwdemo_abstime_T {const char_T *errorStatus;下面的子结构包含关于模型的时间信息的信息。*/ struct {uint32_T clockTick1;uint32_T clockTickH1;uint32_T clockTick2;uint32_T clockTickH2;struct {uint16_T TID[3];uint16_T cLimit [3];} TaskCounters;}时机; }; /* 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 /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('') - opens system 3 * hilite_system('/Kp') - opens and selects block Kp which resides in S3 * * Here is the system hierarchy for this model * * '' : 'rtwdemo_abstime' * '' : 'rtwdemo_abstime/SS1' * '' : 'rtwdemo_abstime/SS2' * '' : 'rtwdemo_abstime/SS3' */ #endif /* RTW_HEADER_rtwdemo_abstime_h_ */

四个32位无符号整数,clockTick1clockTickH1clockTick2,clockTickH2是否有用于存储子系统运行时间的计数器SS2而且SS3

启用优化和重新生成代码

1.重新配置模型,将生命周期设置为1天。

2.构建模型。

已成功完成模型:rtwdemo_abstime的构建过程

检查重新生成的代码

struct tag_RTM_rtwdemo_abstime_T {const char_T *errorStatus;下面的子结构包含关于模型的时间信息的信息。*/ struct {uint32_T clockTick1;uint16_T clockTick2;struct {uint16_T TID[3];uint16_T cLimit [3];} TaskCounters;}时机;};/*块状态(默认存储)*/ 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 /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('') - opens system 3 * hilite_system('/Kp') - opens and selects block Kp which resides in S3 * * Here is the system hierarchy for this model * * '' : 'rtwdemo_abstime' * '' : 'rtwdemo_abstime/SS1' * '' : 'rtwdemo_abstime/SS2' * '' : 'rtwdemo_abstime/SS3' */ #endif /* RTW_HEADER_rtwdemo_abstime_h_ */

的新设置应用程序寿命(天)参数指示代码生成器为时间计数器预留更少的内存。重新生成的代码包括:

  • 32位无符号整数,clockTick1,用于存储任务的运行时间SS2

  • 16位无符号整数,clockTick2,用于存储任务的运行时间SS3

相关信息

单速率建模(裸板,无操作系统)

该模型展示了为裸板目标(没有操作系统)配置的单速率离散时间模型的代码生成。

开放范例模型

打开示例模型rtwdemo_srbb

open_system (“rtwdemo_srbb”

该模型使用一个采样时间,并被配置为在发生更新关系图时显示采样时间颜色。输入块In1_1s和In2_1s指定1秒的采样时间,这是由模型配置参数的设置强制执行的周期抽样时间限制

该模型被配置为使用注释显示用颜色编码的示例时间。要查看它们,在打开模型之后,通过按下更新图表Ctrl + D.按显示图例Ctrl + J.由于模型配置了一个采样时间,因此模型显示为红色,这是模型中表示最快离散采样时间的颜色。

单任务模式下的多速率建模(裸板,无操作系统)

该模型显示了为多速率离散时间模型生成的代码,该模型配置为裸板目标(没有操作系统)上的单任务。

开放范例模型

打开示例模型rtwdemo_mrstbb

open_system (“rtwdemo_mrstbb”

该模型包含两个样本时间。输入块1和输入块2分别指定1秒和2秒采样时间,通过模型配置参数的设置强制执行周期抽样时间限制.该求解器设置为单任务操作。因此,在不同采样时间执行的块之间不包含速率转换块,因为不会发生抢占。

该模型被配置为使用注释显示用颜色编码的示例时间。要查看它们,在打开模型之后,通过按下更新图表Ctrl + D.按显示图例Ctrl + J.红色代表模型中最快的离散样本时间,绿色代表第二快的离散样本时间,黄色代表混合样本时间。

多任务模式下的多速率建模(裸板,无操作系统)

该模型显示了为多任务裸板目标(无操作系统)配置的多速率离散时间模型生成的代码。

开放范例模型

打开示例模型rtwdemo_mrmtbb

open_system (“rtwdemo_mrmtbb”

探索范例模型

该模型包含两个样本时间。输入块1和输入块2分别指定1秒和2秒采样时间,通过模型配置参数的设置强制执行周期抽样时间限制.该求解器被设置为多任务操作,这意味着需要一个速率转换块,以确保在1秒任务抢占2秒任务时强制执行数据完整性。适当的速率转换总是由Simulink和Simulink Coder执行。金宝app该模型指定了一个显式的速率转换块。或者,该块可以通过Simulink设置模型配置参数自动插入金宝app自动处理数据传输的速率转换

该模型被配置为在图表更新时显示采样时间颜色。要查看它们,在打开模型之后,通过按下更新图表Ctrl + D.按显示图例Ctrl + J.红色代表模型中最快的离散样本时间,绿色代表第二快的离散样本时间,黄色代表混合样本时间。

数据传输假设

任务间数据传输的操作基础:

  • 数据转换发生在单个读任务和单个写任务之间。

  • 字节大小变量的读或写是原子的。

  • 当两个任务通过数据转换进行交互时,只有一个任务可以抢占另一个任务。

  • 对于周期性任务,速率较快的任务优先级高于速率较慢的任务;速率较快的任务总是抢占速率较慢的任务。

  • 任务在单个处理器上运行。不允许时间切片。

  • 进程不会崩溃和重新启动(特别是在任务之间传输数据时)

多任务模式下的多速率建模(VxWorks®OS)

这个例子为多任务操作系统目标(VxWorks®)配置的多速率离散时间模型生成代码。该模型包含两个样本时间。输入块1和输入块2分别指定1秒和2秒采样时间,通过模型配置参数的设置强制执行周期抽样时间限制.该求解器被设置为多任务操作,这意味着当1秒任务抢占2秒任务时,需要一个速率转换块来确保数据完整性。金宝appSimulink®和代码生成器执行适当的速率转换。此模型指定显式的速率转换块。或者,您可以通过设置模型配置参数来指示Simulink®为您插入金宝app此块自动处理数据传输的速率转换

该模型被配置为使用注释显示用颜色编码的示例时间。要查看它们,在打开模型后,按Ctrl+D更新图表。按Ctrl+J显示图例。红色代表模型中最快的离散样本时间,绿色代表第二快的离散样本时间,黄色代表混合样本时间。

示例模型

模型=“rtwdemo_mrmtos”;open_system(模型);

交易确定性和数据完整性提高系统性能

该模型显示了在多速率、多任务模型中使用速率转换块的操作模式的差异。速率转换块的灵活选项允许您选择最适合您的应用程序的模式。您可以交换确定性和数据完整性级别,以提高系统性能。

速率转换块操作模式

确保数据的完整性和确定性(DetAndInteg):传输数据时,信号的所有数据字节(包括宽信号的所有元素)都来自同一时间步长。此外,它还确保数据从一个速率传输到另一个速率时的相对采样时间(延迟)总是相同的。只使用ANSI-C代码,不需要目标特定的“临界段”保护。

确保完整性(IntegOnly):传输数据时,信号的所有数据字节(包括宽信号的所有元素)都来自同一时间步长。然而,从一个数据传输到下一个数据传输的相对采样时间(延迟)可能是不同的。在这种模式下,读取/写入数据的代码比在DetandInt模式下运行得更频繁。在最坏的情况下,延迟等效于DetandInt模式,但延迟可以更小,这对某些应用程序是重要的。此外,该模式支持与DetandI金宝appnt模式不支持的异步速率的数据传输。只使用ANSI-C代码,不需要目标特定的“临界段”保护。

无数据一致性操作(无):在这种情况下,速率转换块不生成代码。在保证标量数据类型的原子访问以及数据的相对时态值不重要的某些应用程序中,这种模式是可以接受的。这种模式不引入任何延迟。

数据传输假设

任务间数据传输的操作基础:

  • 数据转换发生在单个读任务和单个写任务之间。

  • 字节大小变量的读或写是原子的。

  • 当两个任务通过数据转换进行交互时,只有一个任务可以抢占另一个任务。

  • 对于周期性任务,速率较快的任务优先级高于速率较慢的任务;速率较快的任务总是抢占速率较慢的任务。

  • 所有任务都在单个处理器上运行。不允许时间切片。

  • 进程不会崩溃/重新启动(特别是在任务之间传输数据时)

模型rtwdemo_ratetrans

open_system (“rtwdemo_ratetrans”

模型rtwdemo_ratetrans显示了以下速率转换块的操作模式的差异。

速率转换块DetAndIntegF2S

确定性和数据完整性(从快到慢的转换):

  • 块输出被用作持久数据缓冲区。

  • 数据以较慢的速率写入到输出,但在较快的速率上下文中完成

  • 较慢速率所看到的数据始终是较快速率和较慢速率最后一次执行时的值。在较慢的速率运行时,较快的速率所执行的任何后续步骤(以及相关的数据更新)都不会被较慢的速率看到。

速率转换块DetAndIntegS2F

确定性和数据完整性(从慢到快的转换):

  • 使用两个持久数据缓冲区,一个内部缓冲区和块输出。

  • 内部缓冲区以较慢的速率复制到输出,但在较快的速率上下文中完成。

  • 内部缓冲区以较慢的速率写入,并且在较慢的速率上下文中写入。

  • 快速率看到的数据总是延迟的,即数据来自慢速率代码的前一步。

速率转换块IntegOnlyF2S

仅限数据完整性(从快到慢的转换):

  • 块输出被用作持久数据缓冲区。

  • 如果一个标志表明数据不在被读取的过程中,那么数据将在更快的速率上下文中写入缓冲区。

  • 设置标志后,数据以较慢的速率从缓冲区复制到输出,然后清除标志。这是与确定性情况相比的额外副本。

  • 较慢的速率所看到的数据可能来自较快的速率的较近期步骤,而不是较慢的速率和较快的速率同时执行时的数据。

速率转换块IntegOnlyS2F

仅数据完整性(从慢到快的转换):

  • 使用两个持久数据缓冲区,它们都是内部缓冲区。

  • 两个缓冲区中的一个总是以更快的速度复制到输出。

  • 两个缓冲区中的一个以较慢的速率写入,在较慢的速率上下文中,然后切换活动缓冲区。

  • 快速速率所看到的数据可能比确定性情况更近期。具体来说,当较慢的速率和较快的速率都有它们的命中值时,较快的速率将从较慢的速率看到先前的值。但是,更快速率的后续步骤可能会看到更新的值(当较慢的速率更新非活动缓冲区并切换活动缓冲区标志时)。

速率转换块NoneF2S

当放弃确定性和数据完整性时,不会为速率转换块生成任何代码。

速率转换块NoneS2F

当放弃确定性和数据完整性时,不会为速率转换块生成任何代码。

bdclose (“rtwdemo_ratetrans”);

相关的话题