【问题标题】:Code generation - Alternative to Simulink API代码生成 - Simulink API 的替代方案
【发布时间】:2014-02-01 08:45:18
【问题描述】:

这是关于大型嵌入式系统项目中的一个典型问题: 来自文本文件/数据库的数据必须硬编码为 C 代码。数据会改变控制流、表维度等。 选择的解决方案是什么?

背景: 在我们的(大型)嵌入式软件中,我们必须将数百个信号(有限状态机的输出)与总线(例如 CAN 总线)连接起来。我们使用 Simulink/Stateflow 作为基于模型的开发工具(状态机)和自动编码。

连接必须扩展,进行数据类型转换等。通常转换/连接的所有信息都存储在数据库或文件中(例如 dbc-text-file)。

显然,通常的动态方式:如果必须确保硬确定性实时能力,则不指示读取数据库并相应地动态连接/转换。此数据必须进行硬编码。

除了使用 Simulink API 之外,我们还没有找到更现实和更实用的方法:编写外部 m 代码,它从文件中读取数据并自动将纠缠连接“绘制图片”到 Simulink 模型中!这最终被自动编码为 C。 不用说,这个脚本化的“绘画代码” - 虽然有效 - 不是很可重用,可维护等。我什至找不到有效的解决方案:编译器/代码生成,模型驱动架构,Autosar,模型转换,考虑。为每个外部数据文档构建一个自己的编译器,将数据转换为 C 代码,似乎是不现实的......

有没有实用的替代方案?这是 Simulink“语言”的根本弱点吗(即它没有像其他模型驱动的嵌入式工具(如 modelica)那样的底层高级语言)?

【问题讨论】:

  • 你能澄清一下这个问题吗?例如:您今天在哪里(DB-text-file -> Simulink 模型 -> C)以及您希望在哪里理想(DB -> C,...?)
  • 你为什么放弃所有你考虑过的事情?例如:Simulink -> DB?我将这种方法与使用 C API 生成的数据定义一起使用(ASAP2 是用于 AUTOSAR 的另一个选项)。
  • 没错,我们在这里:DB-text-file -> Matlab-Script -> Simulink model -> C 理想情况下它可能是这样的: DB-text-file -> embedded Simulink m- function -> C.(这是我放弃的另一种方法:嵌入式 Simulink m-function 是第二类公民,因为它无法确定正在输入的信号名称/信号数量/维度/数据类型以及输出连接的位置to. 所以它不知道如何接口连接/转换)
  • 我没有完全得到您的最终建议:您直接使用 C API 的方式是这样的:DB-text-file -> C(可能通过 Simulink Coder)。如果你的答案是肯定的,我会看看它有多难,因为我还必须使用 API 将数据写回自动代码。希望留在更高级别的语言上。不过谢谢你的好主意。
  • “嵌入式 Simulink m-function 是二等公民……(因为它不能做一些关键分析)”。您提出了我的观点(在我的回答中详细说明)需要强大的分析器的强大的翻译机器,并且现成的机器不想为您这样做(我提供的链接中的点)。因此,您需要能够提供额外智能的机器,以做好工作。

标签: embedded code-generation simulink


【解决方案1】:

您的问题没有很好地描述您的实际问题。

我的阅读方式是您拥有一组复杂的数据,这需要复杂的代码生成过程。每当需要进行复杂的翻译时,您最终都会构建复杂的分析和代码生成机制。这通常不是一件容易的事。

您分两个阶段完成:1) 读取数据库并制作 Simulink,2) 让 MATLAB 将 Simulink 编译为源代码。您的“数据库”内容实际上是规范(例如,DSL)。您有一个读取“规范”并将其解释为 Simulink 模型的前端;您似乎在抱怨 Simulink 没有底层语义。嗯......你的规范 DSL 是否有一个潜在的健壮语义?这可能是你问题的一部分。 Simulink 本身的语义也定义不明确。这种组合意味着无论您从 DSL 到 Simulink 以及从 Simulink 到 C 所做的任何临时转换,实际上都是临时的并且可能难以维护。我们可以争论 C 是否有明确定义的语义;确实可以,但在标准文档中并不容易看到。

无论如何,您正在构建一个分阶段的翻译器。您的第一阶段可能需要更多的结构和更好的分析。理想情况下,您会转换为更正式的中间表示;我一直认为 Colored Petri 网比 Simulink 好得多,部分原因是它们确实具有清晰、形式化的语义。 (Modelica 也很不错)。理想情况下,您应该使用您可以控制的转换规则将中间阶段转换为 C,而不是 Simulink 发生的事情。

如果您拥有构建翻译器的良好基础机制,这会更容易。恕我直言,最好的机械类是program transformation systems。 (我碰巧建了一个 其中 [参见 bio],他们已经了解 C 和 Simulink,并且可以学习 Modelica)。您可以在this SO answer on what it takes to build translators.中阅读更多关于需要什么的信息

【讨论】:

  • 感谢您准确定义我的问题。不幸的是,您的回答引起了我的恐惧:由于我的限制,我无法做到-已经卡在您的链接中。甚至不能给你的答案一分,因为我没有stackoverflow的声誉......
  • “已经卡在你的链接中”?提供的链接有效;你的意思是链接指向的信息让你紧张?从某种意义上说,他们应该;这些是复杂的引擎。 OTOH,您有一个很大的关键问题想要很好地解决。你说过一个半生不熟的方案并不令人满意......那么你就可以转向一个完整的方案:-}
  • @user3174640 您需要至少 15 个代表才能投票,但如果您认为您的问题已得到回答,请单击问题右侧的空心复选标记将答案标记为“已接受” .如果您有足够的代表,您也可以对已接受的答案以及您认为有帮助的任何其他人进行投票。
  • 理解:Simulink、C-API 没有有效解决问题。甚至 modelica 也可能只有一些需要的语言特性,但并非全部都可以直接解决(缺少静态反射之类的东西?)所以非常感谢您的准确分析!我需要你的一个工具,你必须明确加入 Simulink、Modelica 的语言语义定义组,最后实时嵌入式代码变得更加动态(PRET 机器?)...
  • @user3174640:我个人认为你不会从语言的“内部”解决语言分析问题(例如,反射是永远不够的,因为它不能提供对完整细节的访问语言);你必须从外部解决它,这是程序转换系统的重点,它可以从语言之外看到语言的全部细节,进行任意分析(支持)执行任意转换/代码生成任务。
【解决方案2】:

很难弄清楚您的确切问题是什么,但这里有两个建议:

如果您正在寻找可以从您可以理解的状态图中生成代码的代码生成器,请尝试fsmpro.io

要制作单独的逻辑,您必须粘贴代码而不是使用任何内置实用程序来设计单元。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2018-03-14
    • 2014-03-19
    • 2013-07-29
    相关资源
    最近更新 更多