基于时间的调度示例模型
优化时间计数器的内存使用
此示例展示了如何优化代码生成器为时间计数器分配的内存量。该示例优化了存储流逝时间(两个事件之间的时间间隔)的内存。
代码生成器将时间计数器表示为无符号整数。时间计数器的字长取决于模型配置参数的设置应用程序生命周期(天),它指定应用程序运行的预期最大持续时间。可以使用此参数防止时间计数器溢出。默认大小为64位。
属性的设置决定时间计数器使用的比特数应用程序生命周期(天)参数。例如,如果一个时间计数器以1khz的速率递增,为了避免溢出,计数器具有以下位数:
寿命< 0.25秒:8位
寿命< 1分钟:16位
寿命< 49天:32位
寿命> 50天:64位
64位时间计数器在5.9亿年之内都不会溢出。
开放范例模型
打开示例模型rtwdemo_abstime
。
该模型由三个子系统组成魔法石,第1章
,SS2
,SS3
。在数学和数据类型窗格中,应用程序生命周期(天)参数设置为默认值,即正
。
这三个子系统包含一个离散时间积分器,它需要经过的时间作为输入来计算输出值。各子系统的变化如下:
SS1 -时钟在1千赫。不需要时间计数器。采样时间类型触发端口参数设置为
周期
。运行时间内联为0.001。SS2 -时钟在100hz。需要一个时间计数器。基于1天的生命周期,一个32位计数器存储所经过的时间。
SS3 - 0.5 Hz。需要一个时间计数器。基于1天的生命周期,一个16位计数器存储所经过的时间。
模拟模型
模拟模型。默认情况下,模型配置为以不同颜色显示采样时间。三个子系统的离散采样时间分别显示为红色、绿色和蓝色。触发的子系统为蓝绿色。
生成代码和报告
1.为构建和检查过程创建临时文件夹。
2.为代码生成器配置模型,以使用GRT系统目标文件和生命周期正
天。
3.构建模型。
###开始构建过程:rtwdemo_abstime成功完成构建过程:rtwdemo_abstime构建摘要构建的顶级模型目标:模型动作重建原因================================================================================================ rtwdemo_abstime生成和编译的代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 14.925s
检查生成的代码
打开生成的源文件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; /* 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_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_ */
4个32位无符号整数,clockTick1
,clockTickH1
,clockTick2
,clockTickH2
计数器用于存储子系统的运行时间吗SS2
和SS3
。
启用优化和重新生成代码
1.重新配置模型,将生命周期设置为1天。
2.构建模型。
###开始构建过程:rtwdemo_abstime成功完成构建过程:rtwdemo_abstime构建摘要构建的顶级模型目标:模型动作重建原因================================================================================= rtwdemo_abstime生成和编译的代码增量校验和已更改。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 11.47s
检查重新生成的代码
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; /* 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_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”)
该模型包含两个采样时间。import block 1和import block 2分别指定1秒和2秒采样次数,通过模型配置参数的设置强制执行周期采样时间约束。求解器设置为单任务操作。因此,速率转换块不包括在不同采样时间执行的块之间,因为不会发生抢占。
该模型被配置为使用注释显示用颜色编码的采样时间。要查看它们,打开模型后,按下按钮更新图表Ctrl + D。如需显示图例,按Ctrl + J。红色表示模型中最快的离散样本时间,绿色表示第二快的离散样本时间,黄色表示混合样本时间。
多任务模式下的多速率建模(裸板,无操作系统)
该模型显示了为多任务裸板目标(没有操作系统)配置的多速率离散时间模型生成的代码。
开放范例模型
打开示例模型rtwdemo_mrmtbb
。
open_system (“rtwdemo_mrmtbb”)
探索范例模型
该模型包含两个采样时间。import block 1和import block 2分别指定1秒和2秒采样次数,通过模型配置参数的设置强制执行周期采样时间约束。该求解器被设置为多任务操作,这意味着当1秒任务抢占2秒任务时,需要一个速率转换块来确保执行数据完整性。适当的速率转换总是由Simulink和Simulink Coder强制执行。金宝app这个模型指定了一个显式的速率转换块。或者,该块可以通过Simulink设置模型配置参数自动插入金宝app自动处理数据传输的速率转换。
模型被配置为在图表更新时显示采样时间颜色。要查看它们,打开模型后,按下按钮更新图表Ctrl + D。如需显示图例,按Ctrl + J。红色表示模型中最快的离散样本时间,绿色表示第二快的离散样本时间,黄色表示混合样本时间。
数据传输假设
任务间数据传输的操作基础:
数据转换发生在单个读任务和单个写任务之间。
字节大小的变量的读或写是原子的。
当两个任务通过数据转换进行交互时,只有一个任务可以抢占另一个任务。
对于周期性任务,速率快的任务优先级高于速率慢的任务;速率较快的任务总是抢占速率较慢的任务。
任务运行在单个处理器上。不允许进行时间切片。
进程不会崩溃和重新启动(特别是在任务之间传输数据时)
多任务模式中的多速率建模(VxWorks®OS)
此示例为多任务操作系统目标(VxWorks®)配置的多速率离散时间模型生成代码。该模型包含两个采样时间。import block 1和import block 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”);