主要内容

通过插入Pragmas来控制数据和功能放置

对于某些应用程序,您可以使用编译指示和其他代码装饰品来控制内存中的数据(全局变量)和函数定义的位置。例如,接头的配置文件可以定义命名在节章节指令和映射每个部分的范围的存储器地址。在C代码,你包括编译指示该分配全局变量和函数到这些命名部分以及由此延伸,到内存范围。通过控制内存的位置,您可以:

  • 生成对硬件更效率的代码。

  • 模块化您的应用程序代码,以便在开发过程和部署后更容易维护和修改。

嵌入式编码器®和内存部分,您可以:

  • 应用默认编译指示或其他装饰品的模型数据和入口点函数的类别。要配置这些默认值,可以使用代码映射编辑器。例如,您可以:

    • 应用默认编译指示的内部数据,其中包括模块状态,该代码生成无法通过优化消除。您可以应用不同的默认编译恒定的参数,如非标量参数,生成的代码必须存储在内存中。

    • 将默认的pragma应用于生成函数的类别,包括入学点函数,如模型_step.

  • 覆盖各个数据项,诸如块参数,状态和信号的默认编译指示。要做到这一点,创建自己的存储类。

  • 覆盖与原子子系统对应的各个函数的默认拼接,您可以将其配置为在生成的代码中作为具有单独数据的单独函数。使用子系统参数对话框。

使用内存部分插入Pragmas

在此示例中,为由示例模型表示的算法的所有数据和功能配置默认存储器放置rtwdemo_roll。然后,对于某些信号数据,您将覆盖默认放置。

探索范例模型和检查默认生成的代码

  1. 打开示例模型。

    Open_System('rtwdemo_roll'

    该模型被配置成生成高效的生产代码。例如,配置参数默认参数行为设置为

  2. 在里面应用程序画廊,下面代码生成, 点击嵌入式编码器。当C代码标签打开。从模型生成代码。

  3. 在代码生成报告,检查文件RTWDEMO_ROLL.H.。文件定义了表示数据,该算法需要结构类型。例如,该文件定义作为的状态,它表示块的结构类型指出这样离散时间集成商块。

    / *块信号和状态''* / typedef struct {real32_t fixingptunitdelay1_dstate;/ *' / fixt单元delay1'* / real32_t Integrator_dstate;/ *' /积分器'* / int8_t Integrator_prevresettate;/ *' /积分器'* /} dw;

    该文件还声明入口点函数模型。

    / *模型入口点函数* / extern void RTWDEMO_ROLL_INITIALIZE(void);extern void rtwdemo_roll_step(void);
  4. 检查RTWDEMO_ROLL.C.。此文件定义全局结构变量来存储数据。该文件还定义了函数。

在这个例子中,假设你的连接配置文件定义了一个名为段myalgorithm_data.MYALGORITHM_CODE在一个章节指令。您可以配置模型,以便生成的代码包括Pragmas,将分配的内存放置在这些命名部分中的数据和函数。

  • 对于命名的全局变量Myvar.,杂注语法是:

    #pragma sec_myalgorithm_data(“myvar”)双重myvar;

  • 对于命名的函数myFunction的,Pragma语法除外是否相同:

    的#pragma SEC_MYALGORITHM_CODE( “myFunction的”)空隙myFunction的(无效)

创建内存部分

在此示例中,您使用两个具有不同语法的Pragmas,因此您必须创建两个内存部分。

  1. 打开内嵌式编码器应用程序。在这一点C代码选项卡,选中代码接口>嵌入式编码器词典

  2. 在里面嵌入式编码器词典对话框,选择记忆部分标签并单击添加按钮。

  3. 对于新的内存部分,设置这些选项:

    • 名称myalgorithm_data.

    • 陈述周围每个变量

    • 初级陈述#pragma sec_myalgorithm_data(“$ n”)。令牌$ n ..代表使用内存部分的每个变量的名称。

  4. 创建另一个类似的内存部分,该部分对应于MYALGORITHM_CODE

配置默认编译指示数据和功能

  1. 在这一点C代码选项卡,选中代码接口>默认代码映射要么代码接口>个人元素代码映射

  2. 在里面数据缺省标签,展开Inports和Outports信号参数

  3. 在表中,选择inports.排。

  4. 在物业检查员,套装记忆部分myalgorithm_data.

  5. 对于表中的其他行,设置记忆部分myalgorithm_data.

  6. 在下面功能默认值,为表中的每一行,集记忆部分MYALGORITHM_CODE

  7. 在您当前的文件夹中,删除现有slprj.文件夹。

  8. 配置模型来生成唯一的代码。选择配置参数配置参数>仅生成代码

  9. 点击生成代码

现在RTWDEMO_ROLL.C.文件将pragmas应用于结构变量和函数的定义。对于您在代码映射编辑器中配置的每个类别和函数,代码适用Pragma。例如,代码适用myalgorithm_data.编译指示每个结构的该存储块的状态,根级输入,和根电平输出。

/ *块信号和状态(默认存储)* /的#pragma SEC_MYALGORITHM_DATA( “rtDW”)DW rtDW;/ *外部输入(根运行轨迹与默认存储信号)* /的#pragma SEC_MYALGORITHM_DATA( “RTU”)EXTU RTU;* /的#pragma SEC_MYALGORITHM_DATA( “RTY”)ExtY RTY / *外部输出(通过具有默认存储信号馈送根outports);

保留默认的内存部分应用默认存储类或函数模板后

在代码映射编辑器,你可以使用存储类功能自定义模板列来控制生成的代码中的数据的默认外观和函数。当您使用这些列来应用除此之外的设置默认,该代码映射编辑丢弃内存部分,你在Property Inspector应用。要保留内存部分,使用嵌入式编码字典创建一个存储类或函数模板,然后应用存储部分,该存储类或函数模板。

在此示例中,您可以通过创建存储类来配置模型的非参数数据,例如信号和状态,以与相同的结构中出现。保留myalgorithm_data.内存部分,在应用存储部分的存储类。

  1. 在嵌入式编码器字典中为模型,选择存储类标签并单击添加按钮。

  2. 对于新的存储类,设置:

    • 名称struct_data.

    • 存储类型结构化

    • 记忆部分myalgorithm_data.

  3. 在代码映射编辑器,下数据缺省,在这方面存储类列,选择struct_data.对于这些行:

    • inports.

    • 出口

    • 信号状态和内部数据

  4. 从模型生成代码。

  5. 检查RTWDEMO_ROLL.C.。现在,文件定义了包含非参数数据,将所述编译指示给该变量一个单一结构变量。

    / *储存等级 'STRUCT_DATA' * /的#pragma SEC_MYALGORITHM_DATA( “STRUCT_DATA_rtwdemo_roll”)rtwdemo_roll_STRUCT_DATA STRUCT_DATA_rtwdemo_roll;

将默认内存部分包含到单个映射的存储类中

要覆盖默认的存储类,您指定代码映射 - c>数据缺省直接使用代码映射编辑器应用的存储类的数据项。直接应用以外的存储类汽车要么模型默认值绕过您指定的默认内存部分数据缺省。要保留内存部分,请在嵌入的编码器字典中创建存储类,并将所需的存储部分应用于它。然后,将存储类应用于代码映射编辑器中的各个数据项。其他模型无法访问您在嵌入的编码器字典中定义的存储类和内存部分。要在其他模型中共享存储类和内存部分部分,请在Simulink数据字典数据中存储嵌入的编码器字典(金宝appsldd)在您的模型之外。然后,共享目标模型之间的字典。有关更多信息,请参阅将模型文件迁移到共享数据字典的定义

in.rtwdemo_roll,在这方面基础罗兰码子系统,三个增益块代表PID控制算法的参数。在里面保留默认的内存部分应用默认存储类或函数模板后部分,配置模型的非参数数据,例如信号和状态,通过应用默认存储类以相同的结构出现struct_data.。在此示例中,您可以配置增益块的输出信号,以便生成的代码为它们分配内存myalgorithm_data.部分但不会出现在默认存储类结构中。定义新的存储类MyStore.在嵌入的编码器字典中并应用所需的内存部分myalgorithm_data.到它。然后,直接将存储类应用于增益块的输出信号。

  1. 在该模型的嵌入式编码字典,选择存储类标签并单击添加按钮。

  2. 对于新的存储类,设置:

    • 名称MyStore.

    • 存储类型结构化

    • 记忆部分myalgorithm_data.

  3. 在模型中,导航到基础罗兰码子系统。子系统的信号不会自动填充到代码映射编辑器中。您需要通过暂停出现在信号线上或下方的省略省略省略的省略号来手动添加信号以打开动作栏。点击添加信号按钮。该按钮也可用于在代码编辑器映射信号/国标签。

  4. 添加增益块的输出信号后,信号行会出现在代码映射-C.>信号/国标签。通过选择信号的行打开属性检查器。在代码部分,设置这些属性:

    • 存储类MyStore.

    • 标识符块名称。

  5. 从模型生成代码。

  6. 检查生成的文件RTWDEMO_ROLL.C.。该文件定义了一个结构变量mystore_rtwdemo_roll.并应用编译指示变量。

    / *储存等级 '的MyStore' * /的#pragma SEC_MYALGORITHM_DATA( “myStore_rtwdemo_roll”)rtwdemo_roll_myStore myStore_rtwdemo_roll;

  7. 检查生成的文件RTWDEMO_ROLL.H.。结构变量包含增益块的输出信号。现在的输出信号是在不同的结构,但存储在同一myalgorithm_data.内存部分。

/ *储存等级 '的MyStore',用于系统 '<根>' * / typedef结构{real32_T DispGain;/ * ' / DispGain' * / real32_T RateGain;/ * ' / RateGain' * / real32_T IntGain;/ * ' / IntGain' * /} rtwdemo_roll_myStore;

配置Pragma以环绕定义组

如果您的构建工具链要求Pragma或其他装饰围绕着多次定义变量或函数,则在嵌入式编码器字典或自定义存储类设计器中设置陈述周围变量组(自定义存储类设计器中的默认值)。

覆盖各个数据元素的默认内存放置

在代码映射编辑器中配置内存部分默认值(参见配置数据元素和函数类别的默认C代码生成),覆盖各个数据元素(信号,参数和状态)的这些默认设置,通过使用嵌入的编码器字典创建存储类和任何所需的存储器部分。有关更多信息,请参阅,选择创建和存储内存部分定义的位置。当您创建的存储类,设置记忆部分属性到适当的内存部分。然后,使用代码映射编辑器将存储类应用于单个数据元素。

选择创建和存储内存部分定义的位置

要定义内存部分,您必须选择创建它的位置:在嵌入的编码器字典中或在Simulink共享字典中。金宝app

  • 如果需要仅在代码映射编辑器中使用内存部分,请在嵌入的编码器字典中定义内存部分。

    如果你只需要在代码映射编辑器使用的内存部分,并希望与其他车型共享,定义在Simulink®的数据字典(sldd)存储器部分。金宝app有关更多信息,请参阅分享模型之间的嵌入式编码器字典定义

  • 如果需要在代码映射编辑器外部使用内存部分,请在包中定义内存部分。例如,定义包中的存储部分以配置原子子系统的存储部分。有关更多信息,请参阅原子子系统的覆盖内存部分

模型之间共享内存段定义

覆盖默认的内存位置的子系统功能和数据

当您使用原子子系统将生成的代码分区时(参见生成子系统代码作为单独的函数和文件)时,可以应用不同的存储器部分,以各子系统的功能和数据。您还可以指定一个子系统不使用内存部分。

原子子系统的覆盖内存部分

您为子系统指定的内存部分覆盖了在代码映射编辑器中设置的模型级别默认值。使用此技术将子程序或子组件(子系统表示的子组件(由子系统表示)的数据和指令代码聚合到不同的内存区域中。要将内存部分直接应用于原子子系统,请使用自定义存储类设计器定义包中的内存部分。您无法使用您在嵌入的编码器字典中定义的内存部分。然后,将包加载到模型中并配置子系统块参数以指定内存部分。

若要创建存储部分:

  1. 在当前文件夹中,创建一个名为的文件夹+ mypackage。该文件夹定义了名为的包mypackage的。有关更多信息,请参阅创建数据类包

    为了使您的当前文件夹的封装外,您还可以选择添加包含的文件夹+ mypackage文件夹到MATLAB路径。

  2. 打开自定义存储类设计器。

    cscdesigner('mypackage');
  3. 在自定义存储类设计器,选择记忆部分标签。

  4. 点击new

  5. 对于新的内存部分,设置这些选项:

    • 名称myalgorithm_data.

    • 陈述周围每个变量

    • 前报告#pragma sec_myalgorithm_data(“$ n”)

  6. 点击申请节省

  7. 将当前文件夹设置为包含的文件夹+ mypackage文件夹。

要在原子子系统中应用内存部分:

  1. 配置模型的嵌入式编码器字典以如上所述加载目标包请参阅包中的代码生成定义

  2. 要配置目标子系统来指定内存部分,请打开“子系统参数”对话框。在这一点代码生成标签:

    • 功能包装不可用的功能要么可重复使用的功能(用于可重入代码)。

    • 如果你设置了功能包装不可用的功能,以使得能够对子系统中的数据存储部的配置,选择函数单独的​​数据。如果你不选择函数单独的​​数据,子系统数据从模型继承存储部分,或者如果适用,父子系统。

    • 申请myalgorithm_data.直接存储器部分给子系统的功能和数据,使用这些块参数:

      • 用于初始化/终止功能的内存部分

      • 用于执行的功能的存储器部

      • 常量内存部分

      • 内部数据的内存部分

      • 用于参数的内存部分

指定原子子系统不使用内存部分

默认情况下,子系统函数和数据继承了模型级存储部分,您可以在代码映射编辑器中指定相关函数和数据类别。例如,如果为此指定函数自定义模板执行类别,并且该模板承载存储器部分,存储部分适用于子系统执行功能以及模型入口点执行功能。

要指定子系统不使用内存部分,请打开“子系统参数”对话框。在这一点代码生成选项卡,将这些参数设置为默认

  • 用于初始化/终止功能的内存部分

  • 用于执行的功能的存储器部

  • 常量内存部分

  • 内部数据的内存部分

  • 用于参数的内存部分

使用这些设置,子系统不使用每个参数表示的数据或函数的存储器部分。

限制和其他考虑因素

  • 您指定的具有独立数据的原子性,不可再利用子系统的设置仅适用于该子系统的数据和功能,而不是在类似配置的子子系统的数据。原子,有独立的数据不可再利用孩子子系统可以从包含模型继承内存部分,不是从父子系统。

  • 如果你使用构建此子系统要么构建选定的子系统要为指定内存部分的原子子系统生成代码,代码生成器忽略子系统级规格,并使用模型级规格。有关构建子系统的信息,请参阅为各个子系统生成代码和可执行文件

软件包之间的共享内存段(包存储器部分只)

包可以访问和使用在其他包中定义的内存部分,包括自定义包和内置包,例如金宝app。只有一个存储部分的副本存在,在定义它的包。其他包指的是内存部分通过指向它在原来的位置。改变存储器部分,包括对在以后MathWorks公司内置存储器部分®产品发布,可立即在每个引用包中提供。

要配置一个包指的是在另一包中定义的存储部:

  1. 打开自定义存储类设计。在命令提示符下,输入cscdesigner

  2. 选择记忆部分标签。

  3. 使用选择包要选择要在其中引用某些其他包中定义的类或部分的包。

  4. 在里面记忆部分定义窗格中,选择下面要插入参考现有的定义。

  5. 点击新的参考

    使用默认名称和属性的新引用显示在先前选择的定义下方。选择新参考文献,a参考出现选项卡显示参考的初始属性。

  6. 使用名称字段为新的参考输入一个名称。该名称必须是在进口包装独特,而且可以在源代码包复制名称。

  7. 请参阅包中的内存部分指定包含要引用的内存部分包。

  8. 记忆部分参考指定要引用的内存部分。

  9. 点击要么申请将更改保存到内存。要永久保存更改,请单击节省

内存部分的下拉菜单列表的控制外观(封装存储器部分只)

当您将包内存部分,您可以选择从下拉列表存储部分。要控制在列表中的内存部分的顺序,在自定义存储类设计器,使用向上向下纽扣。下拉列表中的内存部分顺序与自定义存储类设计器中的顺序匹配。

保护包内存部分的定义(仅限包存储部分)

当你点击节省在自定义存储类设计器中,设计者将内存部分和自定义存储类定义保存到csc_registration.m.包文件夹中的文件。要确定此文件的位置,请在自定义存储类设计器中检查值文件名

通过转换,您可以防止更改整个包的内存部分定义csc_registration.m.从MATLAB文件到P文件的文件。使用P码功能。

最好的做法是保持csc_registration.m.csc_registration.p.在你的包文件夹。这样一来,如果你需要使用设计器来修改内存部分,你可以删除csc_registration.p.后来在完成修改后重新生成它。由于文件的poded版本优先于包装中,因此在包中存在两个文件时,内存部分受到保护。

限制

  • 代码生成器不会将内存部分应用于使用这些内置存储类的数据:

    • ExportedGlobal.

    • 进口交换机

    • ImportedExternPointer.

  • 在自定义存储类设计器,存储类型限定符您通过使用指定的存储部分预选赛文本框会影响使用的存储类以外的设置唯一的数据项,这些内置存储类:

    • ExportedGlobal.

    • 进口交换机

    • ImportedExternPointer.

    代码生成器省略其他数据类别的限定符。

  • 在自定义块库中创建子系统时,无法为库中的子系统定义指定内存部分。相反,为您在模型中放置的子系统实例指定内存部分。

插入编译指示生成的代码功能和数据

此示例显示如何在生成的代码中插入Pragmas以控制数据的位置和存储器中的函数。要为子系统函数配置内存放置,请使用您在包中定义的内存部分。该示例说明了如何使用在包中定义的存储部分来插入所生成的代码中的功能和数据的Pragmas。

探索示例模型

打开示例模型。

Open_System('rtwdemo_memsec'

  1. 要在EcoderDemos包中查看内存部分,请单击记忆部分定义按钮的模型,然后选择记忆部分标签。

  2. 要为功能和数据配置内存部分,请单击为此模型配置内存部分按钮。在“代码映射编辑器”中,选择相应的行,然后在“属性”检查器中指定内存部分。

  3. 该模型级别设置为原子子系统的默认设置。打开子系统参数下拉列表中看到内存部分设置为模型中每个原子子系统。您可以通过配置子系统模块参数覆盖默认的模型级别设置。

  4. 要生成代码,请单击使用嵌入式编码器生成代码按钮。代码生成报告自动打开。检查数据和功能定义.c文件并观察生成的Pragmas如何对应于指定的内存部分。

相关主题