今天给大家带来的仍然是基于MBD的嵌入式代码生成,主要把应用层和底层接口之间的代码生成配置说一下。本周末会更新功能安全相关,欢迎大家留言交流!
作为一个总是用C写代码的人来说,第一次接触到基于MBD的代码生成的时候就迫不及待的想知道怎么能让生成的代码用到嵌入式控制器中。刚开始,没有Green Hills、没有matlab的硬件支持包,也不会makefile,但简陋的设施仍然无法阻挡我研究的步伐。后来经过摸索发现真想学习代码生成,只需要有单片机软件编译器(对应芯片的就行),matlab就可以搞定。下面通过一个简单实例来给大家演示下,如何通过配置让应用层和底层拥有共同的接口。
假设有如下所示电路,当左侧滑动变阻器发生变化时调整灯的亮度。
首先底层代码肯定会有如下图所示接口示意代码:
其中in_AD为输入接口,out_PWM为输出接口,Test1_step ()为应用程序。Test1.c为应用程序代码。所以说,当接口定义完成后底层代码和应用层代码可以按照这套接口来同时开发,这样加快了项目的开发进度。那接下来看看怎么样才能得到对应的应用代码可以直接放到编译软件中来编译。这里我们建立这样的一个模型:
做以下配置(前言说过的配置不再赘述,大家忘记的可以点击链接会跳转到前前言篇Simulink之嵌入式C代码生成-前言篇):
点击代码生成。
按照下图所示将模型代码放入到编译器中,将Test1.h包含到main.h中,并调用模型生成的代码。点击编译,可以看到编译通过,但是模型到底能不能执行呢?实际仿真一下,答案是不能按照想要的结果执行的。
打开Test1.c就可以看到,模型执行的实际代码如下:
可以发现这里输入接口不是in_AD而是Test1_U.AD;同样的,输出也不是。描述到这里终于到了关键点——如何灵活设置应用层接口?
创建完成信号后记得将workspace中的信号另存为脚本文件(下次分析这一步操作的原因)。设置完成之后再次编译,可观察到生成的代码如下:
代码中的接口与我们最开始定义的接口完全一致了,将代码放到编译器中就可以编译仿真了。向编译器中放代码的时候只需放入Test1相关的文件直接替换即可,不用更改底层代码,用起来是不是很方便?当应用程序比较复杂时,也只是多了几个文件,照样放进去就可以用。
本篇只是演示了接口生成的过程,但是在实际编程过程中不是只有外部变量一种接口,还有像宏定义、可导出外部变量、标定量等等,下篇详细介绍什么样的需求对应什么样的配置。那么,我们下期见!