这是大型嵌入式系统项目中的典型问题: 来自文本文件/数据库的数据必须硬编码为C代码。数据将改变控制流程,表格尺寸等。 选择的解决方案是什么?
背景: 在我们的(大型)嵌入式软件中,我们必须将数百个信号(有限状态机的输出)与总线(例如CAN总线)连接起来。我们使用Simulink / Stateflow作为基于模型的开发工具(状态机)和自动编码。
连接必须扩展,进行dataype转换等。通常,转换/连接的所有信息都存储在数据库或文件中(例如dbc-text-file)。
显然,通常的动态方式是:如果必须确保硬确定性实时能力,则不会指示读取数据库并相应地动态连接/转换。这些数据必须是硬编码的。
除了使用Simulink API之外,我们还没有找到一种现实的,更实用的方法:编写外部m代码,从文件中读取数据并自动将entangeld连接的“绘制图片”放入Simulink模型中!这最终自动编码为C. 毋庸置疑,这个脚本化的“绘画代码” - 虽然有效 - 但不是非常可重复使用,可维护等。我甚至无法找到有效的解决方案:编译器/代码生成,模型驱动架构,Autosar,模型转换,考虑。为每个外部数据文档构建一个自己的编译器,它将数据转换为C代码,似乎是不现实的......
有没有实用的选择?这是Simulink“语言”的一个根本弱点(即它没有像其他模型驱动的嵌入式工具一样的基础高级语言,如modelica)?
答案 0 :(得分:4)
你的问题并没有很好地描述你的实际问题。
我读它的方式是你有一组复杂的数据,需要复杂的代码生成过程。每当需要复杂的翻译时,您最终都会构建复杂的分析和代码生成机制。这通常不是一件容易的事。
你已经完成了两个阶段:1)读取数据库并制作Simulink,2)让MATLAB将Simulink编译为源代码。您的“数据库”内容实际上是规范(例如,DSL)。你有一个前端读取“spec”并将其解释为Simulink模型;你好像在抱怨Simulink没有潜在的语义。那么......您的规范DSL是否存在潜在的强大语义?这可能是你问题的一部分。 Simulink本身的语义也很差。这种组合意味着无论您从DSL到Simulink以及从Simulink到C进行的任何临时转换实际上是临时的,并且可能难以维护。我们可以争论C是否具有清晰定义的语义;它确实有,但在标准文件中并不容易看到。
无论如何,您正在构建一个分阶段的翻译。您的第一阶段可能需要更多结构和更好的分析。理想情况下,你会转变为更正式的中间代表;我一直认为有色Petri网比Simulink好得多,部分原因是它们确实具有清晰,正式的语义。 (Modelica也很不错)。理想情况下,您可以使用您可以控制的转换规则将中间阶段转换为C,而不是Simulink正在做的事情。
如果您有良好的基础机制来构建翻译,这将更容易。为此目的,最好的机械类恕我直言program transformation systems。 (我碰巧建了一个 他们[见bio],已经知道C和Simulink,可以教Modelica)。您可以在this SO answer on what it takes to build translators.
中详细了解所需内容答案 1 :(得分:-1)
很难弄清楚您的确切问题是什么,但这里有两个建议:
如果您正在寻找可以从您可以理解的状态图中生成代码的代码生成器,请尝试 fsmpro.io
要制作单独的逻辑,您必须粘贴代码,而不是使用任何内置实用程序来设计单元。