主要内容

堆栈使用分析生成的代码金宝app模型

确定大小的堆栈内存所需运行生成的代码,您可以运行一个software-in-the-loop (SIL)或processor-in-the-loop(公益诉讼)模拟,生成一个堆栈使用概要文件。银或公益诉讼模拟工具生成的代码和使用仪器计算堆栈使用。仿真完成后,您可以查看代码堆栈分析报告显示最小值,平均值,最大内存需求。使用仿真数据检查器,您可以观察到流堆栈使用信息期间和之后的仿真。生成的配置文件使您能够观察的影响编译器优化和数据输入堆栈使用。

您可以生成堆栈使用概要文件使用顶级模特或模型块硅/公益诉讼工作流。子系统SIL /公益诉讼工作流不支持栈使用分析。金宝app

动态堆栈使用分析的好处

静态堆栈使用分析有一些局限性。例如,它不考虑:

  • 内存优化编译器执行的。例如,变量优化掉或存储在寄存器中。

  • 额外的内存,在函数调用编译器使用。编译器存储的地址执行返回在函数调用之后。

  • 内存对齐,编译器适用。

银或提供的动态使用堆栈分析公益诉讼模拟没有上市的限制,因为模拟计算的实际内存使用编译后的代码。

配置堆栈的使用分析

银或公益诉讼运行仿真,生成堆栈使用指标:

  1. 在仿真软件金宝app®编辑器,打开你的模型。

  2. 应用程序选项卡上,单击银/公益诉讼经理

  3. 模式部分中,选择银/公益诉讼模拟

  4. 准备节中,指定被测系统如果需要的话,银/公益诉讼模式。公益诉讼仿真需要驱动程序实现,获得堆栈使用数据从目标硬件。看到从目标硬件获取堆栈使用数据。

  5. 启用堆栈使用分析的准备部分:

    1. 打开设置画廊。

    2. 时间分析,单击任务分析按钮,功能按钮。

    3. 报道,单击覆盖集合按钮。

    4. 堆栈分析,单击堆栈分析上的按钮。这一行动选择测量任务堆栈的使用配置参数,它提供了堆栈使用测量每个生成的任务。顶部模型设置参数覆盖相应的设置在参考模型。

  6. 点击,打开配置参数对话框。在数据导入/导出窗格中,清除单一的模拟输出复选框。

  7. 查看流堆栈使用在模拟过程中,检查员打开模拟数据。在结果部分中,点击

  8. 运行部分中,点击运行银/公益诉讼

在MATLAB®基本工作空间时,模拟生成一个变量缺省名称,stackProfile,存储堆栈使用数据。你可以通过指定另一个名称栈空间变量配置参数。

查看堆栈使用指标任务和功能

假设你运行一个SIL的仿真模型:

mStackProfilingTopModel

当SIL模拟完成,代码打开堆栈分析报告。看到堆栈的代码分析报告

查看堆栈代码中使用量度概要分析器:

  1. 单击银/公益诉讼选项卡。

  2. 结果画廊,下堆栈分析结果,点击代码概要分析器。这个应用程序显示信息栈内存总结面板。

栈内存面板,异形任务视图显示堆栈使用量度这些生成的代码部分:

  • 模型初始化函数mStackProfilingRefModel_initialize

  • 阶跃函数所代表的任务mStackProfilingRefModel_step

对于每个代码部分,表提供了这样的信息:

  • 最低的使用——最低堆栈内存使用字节。

  • 平均使用——平均堆栈内存使用字节

  • 最大的使用——最大堆栈内存使用字节

  • 最小函数调用深度——最小数量的嵌套的函数调用。

  • 最大函数调用深度最大数量的嵌套的函数调用。

  • 调用的次数,生成的代码部分。

异形功能视图显示每个执行函数的内存需求。

对于每个函数,表提供了这样的信息:

  • 函数——函数名在生成的代码

  • 内存使用情况——需要堆栈内存字节

  • 调用——函数被调用的次数

查看任务的堆栈使用分布:

  1. 异形任务视图中,单击一个任务行。

  2. 结果部分中,点击生成分布

查看栈的变化使用模拟,在结果部分,单击导出SDI。

栈内存使用情况mStackProfilingRefModel_step波动在112和64字节。产生的波动是因为嵌套函数如果行动子系统块调用mStackProfilingRefModel_step只有当信号previous_output甚至有一个值。

…如果((int32_T) (uint8_T) ((int32_T) rtb_previous_output % 2) = = 0) {/ * IfAction子系统输出:“< Root > /如果行动子系统”包含:* ActionPort:“< S1 > /行动端口”* / / *输出原子子系统:“< S1 > /子系统”* /子系统(rtb_previous_output &rtY.Out1);/ *结束输出子系统:< S1 > /子系统的输出子系统:结束* / / * < Root > /如果行动子系统的* /}…

查看调用一个函数:

  1. 异形功能视图中,单击行包含的功能,例如,mStackProfilingRefModel_step

  2. 结果部分中,点击突出显示的代码。代码生成的报告显示调用生成的代码。

跟踪的模型组件代码生成,结果部分中,点击开放模式

比较使用堆栈和基线

你可以从当前堆栈使用的值进行比较对从基线值模拟仿真。

  1. 在将来发布分析部分中,点击比较

  2. 比较当前数据和下拉列表中,选择工作区包含基准仿真的结果变量。您可以通过单击下拉列表更新刷新列表按钮。

  3. 单击比较按钮。

面板提供了这些视图:

  • 任务比较——一个百分比的比较任务堆栈使用两个模拟值。你也可以看到一个嵌套的数量比较,每个任务的函数调用。

  • 函数比较——一个百分比的比较函数堆栈使用值两个模拟。你也看到一个比较每个函数调用的数量。

表细胞颜色:

  • 绿色如果当前执行指标小于基线值。

  • 黄色如果当前执行度量大于基线值。

如果工作空间变量为基准仿真代码部分,不包含数据面板显示

摘要面板(堆栈使用)

总结面板提供了各种各样的模拟信息。

  • 异形组件——金宝app仿真软件模型生成代码的来源

  • 工作流-类型的代码执行

  • 环境——模拟环境

  • 字大小(位),最大的原子整数,指针大小(位)——配置参数的值ProdWordSize,ProdLargestAtomicInteger,ProdBitPerPointer分别。硬件特征表明目标编译器如何看待记忆和一致变量。

  • 马克斯堆栈允许——的价值MaxStackUsageAllowed工作区中的属性变量包含堆栈使用测量。看到堆栈的代码分析报告

  • 驱动程序类型——司机用于获得堆栈使用数据从目标硬件。定制的或通用的。

  • 创建的时间——日期和时间空间变量创建堆栈使用量度。

堆栈的代码分析报告

您还可以查看堆栈使用量度为生成的代码通过打开的HTML报告的模拟。

请注意

如果你关闭的报告,你可以重新打开报告。使用这些操作之一:

  • 银/公益诉讼选项卡,结果画廊,下堆栈分析结果,点击生成报告

  • 在代码中概要分析器,结果部分中,点击生成报告

在第一节中,报告:

  • 提供信息,表明目标编译器如何看待记忆和一致变量。

  • 国家是否有针对性或通用驱动程序获得堆栈使用数据从目标硬件。

  • 为该报告提供了一个时间戳。

对于每个任务,报告的第二部分提供了这样的信息:

  • 最低堆栈使用字节——最低堆栈的使用,在字节。

  • 平均堆栈使用字节——平均堆栈使用字节。

  • 最大堆栈使用字节——最大堆栈的使用,在字节。

  • 最小函数调用深度——最小数量的嵌套的函数调用。

  • 最大函数调用深度最大数量的嵌套的函数调用。

  • 调用的次数,生成的代码。

这份报告提供了更多的信息通过点击图标。指定工作空间变量包含堆栈使用数据,例如,stackProfile,必须出现在工作区中。

如果您点击,您可以查看堆栈的使用分布模拟。

如果您点击,您可以查看仿真堆栈使用的变化。

为每一个函数,第三节的报告提供了这样的信息:

  • 内存的字节——使用栈内存,以字节为单位

  • 调用——函数被调用的次数。

如果您点击的函数调用,您可以查看代码生成报告。

如果你指定一个值最大堆栈大小(字节)(MaxStackSize),该报告提供了第四节。本节显示了每个任务的最大堆栈使用引用允许的最大堆栈大小,水平条形图显示为红色线。如果MaxStackSize价值远远大于栈使用任务,条形图不显示红线。帮助你的视觉分析堆栈的使用需求,您可以使用MaxStackUsageAllowed工作空间变量的属性respecify最大堆栈大小值。例如:

stackProfile。MaxStackUsageAllowed = 64;报告(stackProfile);

公益诉讼期间实现驱动程序获取堆栈使用数据模拟

公益诉讼仿真需要驱动程序实现,获得堆栈使用数据从目标硬件。司机必须返回堆栈寄存器的值。

请注意

如果你不为你的目标指定一个司机硬件,公益诉讼模拟试图使用默认的通用驱动程序。

当你建立公益诉讼目标连接,指定司机通过rtw.connectivity.Config子类。这段代码提供了一个示例。

classdef overheadConnectivityConfig < rtw.connectivity。配置方法函数= customConnectivityConfig (componentArgs) %创建builder targetApplicationFramework =…mypil.TargetApplicationFramework (componentArgs);builder = rtw.connectivity。MakefileBuilder (componentArgs……targetApplicationFramework”);%创建发射器发射= mypil。发射器(componentArgs builder);%建立通信hostCommunicator = rtw.connectivity.RtIOStreamHostCommunicator (…componentArgs,……发射器,…… rtiostreamLibTCPIP); % Call super class constructor to register components this@rtw.connectivity.Config(componentArgs,... builder,... launcher,... hostCommunicator); % Specify driver implementation that obtains stack usage % data from the target hardware stackUsageDriver = coder.profile.StackDriver(); stackUsageDriver.PtrDataType = 'uint64'; stackUsageDriver.HeaderFile = 'myHeaderFile.h'; stackUsageDriver.SourceFile = 'mySourceFile.c'; stackUsageDriver.IncludePaths = {'path/To/myFolder1', ... 'path/To/myFolder2', ... 'path/To/myFolder3'}; stackUsageDriver.DriverFunction = 'myDriverFunction'; this.setStackDriver(stackUsageDriver); end end end

关于设立公益诉讼目标连接的更多信息,见:

另请参阅

相关的话题