主要内容

堆栈使用分析生成的代码MATLAB代码

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

动态堆栈使用分析的好处

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

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

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

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

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

生成堆栈使用配置文件

在运行之前software-in-the-loopprocessor-in-the-loop(公益诉讼)执行,使堆栈使用分析:

  1. 打开MATLAB®编码器™应用MATLAB将来发布应用程序下,代码生成,点击应用程序图标。

  2. 打开您的项目,点击然后点击打开现有的项目。选择项目。

  3. 生成代码页面,点击旁边的箭头生成

  4. 在生成对话框中:

    1. 点击更多的设置

    2. 点击调试

    3. 银/公益诉讼,选择使入口点堆栈配置复选框。

    4. 点击关闭

    5. 点击生成

请注意

堆栈的使用分析不支持OpenMP图书馆。金宝app在您生成代码之前,在生成代码页面,点击旁边的箭头生成。然后,单击更多的设置。下先进的,设置使OpenMP图书馆如果可能的话没有

或者,从命令窗口中,指定的属性coder.EmbeddedCodeConfig对象。例如:

%使入口点堆栈使用分析配置。代码StackProfiling = true;%禁用OpenMP配置。EnableOpenMP = false;

视图从SIL执行堆栈使用概要文件

MATLAB函数,执行software-in-the-loop执行生成堆栈使用测量数据,然后使用数据来确定栈内存需求。

在您的本地工作目录,创建函数foo.m,通过使用一个递归函数评估一个整数的阶乘。

函数= foo () coder.inline(“从未”);= factorial_(的);结束函数= factorial_ () coder.inline(“从未”);如果在= = 1 = 1;其他在* factorial_ = (1);结束结束

配置SIL执行堆栈使用分析。

配置= coder.config (“自由”);配置。GenerateReport = true;配置。VerificationMode =“银”;配置。代码StackProfiling = true; config.EnableOpenMP = false;

在文件夹中,创建test_example.mMATLAB脚本,多次调用编译函数。

idx = 1:尺寸(X, 1) Y (idx, 1) = foo (X (idx, 1));结束

创建一个测试向量的整数。

X = [1 2 5 8] ';

生成的代码库喷火MATLAB函数和SIL接口和启动SIL执行。

codegen报告配置配置喷火arg游戏{1}以及test_example
代码生成成功:查看报告运行测试文件:“foo_sil.mexw64”与墨西哥人“test_example”功能。# # #银开始执行“foo”终止执行:明确foo_sil堆栈分析数据可用于查看。开放仿真数据检查。堆栈分析报告后终止。

观察流堆栈使用测量执行运行时,点击仿真数据检查链接。

打开代码堆栈分析报告,终止SIL执行过程通过单击链接明确foo_sil

# # #申请停止了# # #停止SIL执行“foo”堆栈分析报告:报告(getCoderStackProfile (“foo”))

然后,点击链接报告(getCoderStackProfile (“foo”))

您可以创建一个工作空间变量,执行时间的数据。

stackUsageProfile = getCoderStackProfile (“foo”);

如果你关闭报告,您可以重新运行的报告:

报告(stackUsageProfile)

第一节:

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

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

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

第二节提供了,对于每一个任务,这个信息:

  • 最低、平均和最大堆栈使用字节。

  • 多次调用生成的代码。

这份报告提供了更多的信息通过点击图标。工作空间变量,例如,stackUsageProfile,必须出现在工作区中。

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

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

输入参数的整数值喷火增加而连续调用函数。随着整数值的增加,递归调用函数的数量factorial_ ()也会增加,从而导致观察到的栈内存使用量的增加。

第三节显示了每个任务的最大堆栈使用参照最大堆栈大小允许的。在硅或公益诉讼执行MATLAB编码器配置设置StackUsageMax参数指定最大堆栈大小,条形图显示作为一个水平的红线。如果StackUsageMax价值远远大于栈使用任务,条形图不显示一条红线。帮助你的视觉分析堆栈的使用需求,您可以使用MaxStackUsageAllowed工作空间变量的属性respecify最大堆栈大小值。例如:

stackUsageProfile = getCoderStackProfile (“foo”);stackUsageProfile。MaxStackUsageAllowed = 550;报告(stackUsageProfile);

实现驱动程序获取堆栈使用数据在公益诉讼执行

公益诉讼的执行需要一个司机实现获得堆栈使用数据从目标硬件。司机必须返回堆栈寄存器的值。

请注意

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

当你建立公益诉讼目标连接,指定司机通过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

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

另请参阅

相关的话题