主要内容

选择一个外部代码集成工作流

软件项目通常涉及组合来自多个来源的代码。代码生成应用程序的典型系统结构由一个框架组成,该框架组合了来自多个源的代码,包括外部代码和从Simulink生成的代码金宝app®模型。

该图显示了一个需要集成现有硬件设备驱动程序代码的应用程序。核心软件算法和逻辑可以是用于集成到Simulink环境中的外部可重用算法的代码模块和作为整体模型设计一部分生成的代码的组合。金宝app

完成这些任务可以帮助您选择与项目相匹配的外部代码集成工作流和工具。

任务 行动 更多的信息
1 对应用程序进行分区,将算法映射到组件,并标识集成点。

软件部署目标和部署类型(嵌入式编码)划分软件问题(嵌入式编码),将嵌入式系统架构映射到Simulink建模环境金宝app(嵌入式编码)

2 确定是否可以依赖代码生成器生成的调度代码,或者是否必须将生成的代码与特定于运行时环境的调度机制集成。 选择一个软件执行框架来调度代码执行(嵌入式编码)
3. 评估您正在导入的外部代码的特性。 评估外部代码的特性(嵌入式编码)
4 确定集成需求,这有助于为您的集成选择最佳的工具。 识别集成需求(嵌入式编码)
5 根据任务1-4的结果,选择一个工作流。 选择工作流(嵌入式编码)

选择一个软件执行框架来调度代码执行

代码生成器支持两种类型的软件执行框架—金宝app—单一顶层模型和多个顶层模型。要回答的第一个问题是,这两个框架中哪一个能够满足项目的调度和其他需求。例如,您可以将外部代码导入单个基于费率的顶级模型。您可以从单个顶级模型或多个顶级模型导出代码,以便与自定义(外部)调度机制集成。

  • 单顶模型

    从外部代码和Simulink C/ c++代码生成器生成的代码中生成一组应用程序代码文件。金宝app生成的代码包括一个调度程序。在这种情况下,你进口将代码导入Simulink代金宝app码生成环境。

  • 单个顶级模型或多个顶级模型

    将代码生成器从模型组件生成的C或c++代码与外部应用程序代码和外部调度器集成。你出口从Simulink代码生成环境生成代码。金宝app

将对外部设备驱动程序代码的调用导入到模型中,并为该模型生成用于导出的代码,这涉及到导入和导出代码。

基于目标和需求,外部代码集成有几种特点,需要不同的工作流和集成工具:

  • 将现有的外部代码导入生成的代码中。

    • 调用可重用的外部算法代码进行模拟和代码生成。

    • 在生成的代码中放置外部C/ c++代码。

    • 调用外部设备驱动程序。

    • 应用函数和操作符代码替换。

    • 与外部定时器中断或调度器接口。

    • 为特定的运行时环境生成替换代码。

  • 导出生成的代码以包含在外部代码库中。需要嵌入式编码器®

    • 生成用于导出的组件源代码。

    • 生成用于导出的共享库。

    有关导出生成的代码的详细信息,请参见可调用函数集成(嵌入式编码)

接下来,看到评估外部代码的特性(嵌入式编码)

评估外部代码的特性

在选择外部集成工作流之前,评估外部代码的这些特征。为了与外部代码交互,生成的C或c++代码处理一个或多个外部代码特征。理解这些特征以及建模、仿真和代码生成的需求有助于您为集成场景选择最佳的工作流程。(见识别集成需求(嵌入式编码))。

特征 要考虑什么
硬件的依赖

外部代码是否依赖于硬件?实用函数、查找表和过滤器都是与硬件无关的代码。

设备驱动程序直接与硬件交互。它们取决于硬件的特性。例如,用于模数转换器的设备驱动程序可初始化、从硬件寄存器读取数据并将数据写入硬件寄存器。硬件差异和依赖关系涉及数据类型大小、字节数、移位操作、编译器指令以及优化的函数和操作符支持。金宝app其他代码通过使用API和映射到特定内存地址的数据与设备驱动程序接口。通常,在开发计算机上进行模拟是不可能的。在开发计算机上进行模拟时,对寄存器进行读写会产生意想不到和不想要的结果。

可重用的 外部代码是可重用的软件模块吗?示例包括实用函数、查找表、过滤器、专用积分器和比例-积分-导数(PID)控制模块。
函数调用之间的数据持久性依赖关系 外部代码是否需要持久数据?例如,对一阶筛选器函数的调用使用先前对该函数调用的输出来计算新的输出值。您可以选择将数据定义为全局数据,或者在函数上下文之外使用共享内存。
数据类型和接口 外部代码使用的数据有多复杂?数据接口是什么样子的?它由参数、返回值、全局变量和访问函数组成。代码使用什么数据类型?类型仅限于基本的ANSI C整数、浮点类型、整数数组或浮点类型以及指向这些类型的指针吗?接口是否包含结构或指向结构的指针?
定点代码 外部代码是否设计为仅在整数处理器上运行?如果是,代码交换并只使用表示为整数的数据。数据可以与定点缩放或偏移量相关联。
外部资源依赖 外部代码是否使用在代码范围之外定义的数据、函数或宏?例如,函数可以使用标准ANSI函数、共享库或预定义常量。在这些情况下,必须将外部资源的路径和文件名告知编译器和链接器。
需要外部求解器 您是否使用外部函数进行高级开发或快速原型,以描述具有连续传递函数或一组微分方程的系统?如果是,则外部代码依赖于外部求解器。

接下来,看到识别集成需求(嵌入式编码)

识别集成需求

在选择外部集成工作流之前,请检查这些集成需求。了解这些需求和外部代码的特征可以帮助您为集成场景选择最佳的工作流程。(见评估外部代码的特性(嵌入式编码))。

要求 要考虑什么
努力 集成项目计划的工作级别是什么——低、中还是高?
学习努力 所分配项目资源的编程经验是什么?分配的资源对Simulink和MathWorks有多少经验金宝app®C/ c++代码生成产品?下载188bet金宝搏
模拟和代码生成行为 您想利用基于模型的设计吗?要充分利用基于模型的设计,请将代码转换为建模元素,然后可以在Simulink和Stateflow中使用这些元素金宝app®仿真环境。然后,模拟并生成集成组件的代码。使用软件在环(SIL)或处理器在环(PIL)测试来验证算法行为在两个环境中是否相同。
数据接口和类型
  • 您的模型或生成的代码是否需要与外部函数交换数据?如果是,则将输入、输出和参数映射到外部函数接口。典型的函数接口包括函数参数和返回值、全局变量和访问函数,例如getRPM

  • 要表示数组、结构还是枚举类型?在Simuli金宝appnk环境中,可以将这些类型表示为向量、总线和IntEnum,分别。

  • 是否需要定点支持?金宝app如果使用Simulink定点接金宝app口,则可以缩放和指定偏移量。

  • 外部代码是否使用公司特定的数据类型?如果是,并且您有嵌入式Coder软件,请创建别名类型来表示这些外部类型。代码生成器在其生成的代码中使用别名类型。例如,一旦定义了,就可以在函数原型中为临时变量或块输出指定别名类型。

  • 代码是否与共享内存交换数据?如果是,请定义并使用内存段。

直接函数调用 您想直接从模型调用C外部代码吗?您可以从机制中进行选择,例如C函数块,C调用者block、遗留代码工具、statflow外部代码接口和图表动作语言,以及MATLAB®功能块。
在生成的代码中插入外部代码 要控制生成代码中外部代码的位置吗?要将代码插入到生成的入口点函数中吗?您可以使用模型配置参数或自定义代码块在生成的代码中放置代码。
代码生成优化支持金宝app 是否要优化代码生成器生成的代码?如果是这样,您可以为代码生成器配置模型,以根据应用程序目标(例如执行、ROM和RAM效率)优化它生成的代码。您还可以选择使用代码替换库。
文件要求 您想要最小化所维护的文件数量吗?一些外部代码集成工具要求您维护单独的文件来定义模拟和代码生成。

接下来,看到选择工作流(嵌入式编码)

选择工作流

若要选择将外部代码集成到Simulink环境中的工作流,请使用下表中的链接以获取更多信息。金宝app

目标 行动 更多的信息

从生成的代码调用与硬件无关的可重用外部算法代码。例如:实用函数、查找表和数字过滤器。

根据编程语言和其他集成需求,选择将外部代码集成到Simulink环境中以生成代码的方法。金宝app 调用可重用的外部算法代码进行仿真和代码生成(嵌入式编码)
从生成的代码调用依赖于硬件的外部可重用的外部算法代码。例如:设备驱动程序。 从Simulink环境调用外部驱动程序代码。金宝app 调用外部设备驱动程序(嵌入式编码)
在生成的代码中放置外部C/ c++代码。 使用模型配置参数或自定义代码块使用外部代码增强函数。 在生成的代码中放置外部C/ c++代码(嵌入式编码)
更改代码生成器为函数和操作符生成的代码,以满足应用程序代码需求。 使用代码替换来指定函数和操作符的特定于应用程序的实现。 应用函数和操作符代码替换(嵌入式编码)

相关的话题