主要内容

基于时间的调度示例模型

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

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

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

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

  • 寿命< 0.25秒:8位

  • 寿命< 1分钟:16位

  • 寿命< 49天:32位

  • 寿命>50天:64位

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

开放范例模型

打开示例模型rtwdemo_abstime

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

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

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

  • SS2 -时钟在100赫兹。需要一个时间计数器。基于1天的生命周期,32位计数器存储经过的时间。

  • SS3 - 主频为0.5赫兹。需要一个时间计数器。基于第1天的寿命,16位计数器存储经过的时间。

模拟模型

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

生成代码和报告

1.创建用于构建和检查过程中的临时文件夹。

2.配置模型的代码发生器以使用GRT系统目标文件和寿命的天。

3.构建的模型。

###成功完成rtwdemo_abstime的构建过程模型重建行动的原因  ================================================================================================ rtwdemo_abstime代码生成和编译代码生成信息文件不存在。建造时间:0小时0米18.569秒

检查生成的代码

打开生成的源文件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_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 /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计数器是否用于存储子系统的运行时间SS2SS3

启用优化和重新生成代码

1.重新配置模型,将寿命设置为1天。

2.构建的模型。

# # #开始构建过程:rtwdemo_abstime # # #成功完成构建过程:rtwdemo_abstime模型建立目标:总结构建模型重建行动的理由  ================================================================================= rtwdemo_abstime生成和编译代码增量校验和已经改变了。1个模型建立(0个模型已经更新)建立时间:0h 0m 12.249s

查看再生码

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_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 /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-second和2-second的采样时间,由模型配置参数的设置强制执行周期性样本时间约束.求解器被设置为单任务操作。因此,在不同采样时间执行的块之间不包含速率转换块,因为不会发生抢占。

该模型被配置为使用注释显示颜色编码的示例时间。看到他们,打开模型后,按更新图Ctrl + D.显示图例,按Ctrl + J.红色代表模型最快离散采样时间,绿色表示第二速度最快,并且黄色代表混合样品倍。

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

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

开放范例模型

打开示例模型rtwdemo_mrmtbb

open_system (“rtwdemo_mrmtbb”

探索模型示例

该模型包含两个样本时间。import block 1和import block 2分别指定了1-second和2-second的采样时间,由模型配置参数的设置强制执行周期性样本时间约束.解算器被设置为多任务操作,这意味着需要的速率过渡块,以确保数据的完整性,当1秒任务抢占2-第二任务被执行。正确率转换总是由Simulink和Simulink的编码器执行。金宝app该模型指定一个明确的速率转换块。可替代地,这个块可被自动设定的Simulink模型配置参数插入金宝app自动处理速率转换的数据传输

该模型是在图更新配置为显示采样时间的颜色。看到他们,打开模型后,按更新图Ctrl + D.显示图例,按Ctrl + J.红色代表模型最快离散采样时间,绿色表示第二速度最快,并且黄色代表混合样品倍。

数据传输假设

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

  • 一个单一的阅读任务和一个写作任务之间进行数据转换。

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

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

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

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

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

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

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

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

示例模型

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

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

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

速率转换块操作模式

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

确保完整性(IntegOnly):传输数据时,信号的所有数据字节(包括宽信号的所有元素)都来自同一时间步长。然而,从数据中的一个传递到下一个,其数据被转移的相对采样时间(延迟)可以变化。在这种模式下,该代码读/写的数据被比在DetandInt模式下运行更频繁。在最坏的情况下,延迟相当于DetandInt模式,但迟迟不那么这是很重要的一些应用。另外,从异步速率此模式支持数据传金宝app送到/其中DetandInt模式不能支持。仅使用ANSI-C代码,不需要目标具体的“临界区”的保护。

不执行数据一致性操作(无)对于本例,Rate Transition块不会生成代码。在某些保证了标量数据类型的原子访问且数据的相对时间值不重要的应用程序中,这种模式是可以接受的。该模式不引入任何延迟。

数据传输假设

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

  • 一个单一的阅读任务和一个写作任务之间进行数据转换。

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

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

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

  • 所有任务在一个处理器上运行。时间分片是不允许的。

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

模型rtwdemo_ratetrans

open_system (“rtwdemo_ratetrans”

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

率过渡块DetAndIntegF2S

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

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

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

  • 慢速率所看到的数据总是快速率和慢速率最后执行时的值。当较慢的速率正在运行时,较慢的速率看不到任何后续的步骤(以及相关的数据更新)。

率过渡块DetAndIntegS2F

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

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

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

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

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

率过渡块IntegOnlyF2S

数据完整性只(快到慢过渡):

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

  • 如果一个标志表明数据不在被读取的过程中,则在速度较快的上下文期间将数据写入缓冲区。

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

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

率过渡块IntegOnlyS2F

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

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

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

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

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

率过渡块NoneF2S

当放弃确定性和数据完整性时,不会为Rate Transition块生成代码。

率过渡块NoneS2F

当放弃确定性和数据完整性时,不会为Rate Transition块生成代码。

bdclose (“rtwdemo_ratetrans”);

相关的话题