目录
前言
在实际工程开发过程中,Simulink生成的代码都是构建的算法实现的,纯软件实现,生成的代码大多也是直接在CPU上运行的。实际还有一些MCU集成了像Cordic,协处理器等。有些代码就需要放在特定的函数里执行,或者直接调用硬件的资源进行计算。除非是MCU和Matlab有深度合作,把硬件资源做成模块直接使用。如下是STM32G4的硬件资源库,可以在Simulink环境建模。这需要和工具链进行深度集成。
如果是没有深度集成的MCU则可以考虑替换掉生成的代码,采用芯片官方提供的库函数或者自己手写的库函数。
这里举个例子:
下图是一个调用硬件Cordic实现Sin函数的计算,目的是在仿真结束后生成的Sin函数用的是这部分手写代码。不用查表法或者软件Cordic来计算,提升软件效率。这里就需要用到Matlab的Code Replacement Tool。
代码替换库操作步骤
1.在工作空间的命令窗口输入crtool命令,弹出如下窗口
新建一个Table,选择Function,这里面可以选择三角函数或者其他的计算公式。
设置函数名,和手写的函数名一样,再设置函数的数据类型,其他的默认配置就可以。
把手写代码的路径添加进来
把刚刚的Function再复制一份如下:
配置好后点一下Validate entry,最后点保存,把生成的.m保存在当前的工作空间。
生成注册文件
1.在 Code Replacement Tool 中,选择 File > Generate registration file。
2.在 Generate registration file 对话框中,编辑对话框字段以匹配下图,然后点击 OK。
Table list和保存的名字一样,其他的自定义即可。
保存到当前工作空间,如下表示创建成功
命令窗口输入指令:RTW.TargetRegistry.getInstance('reset');
按照下面的步骤,配置Code replacement libraries:选择配置好的sin test.
在仿真模型的替换Trigonometric模块,如下
运行仿真,查表和用的模块仿真效果相同。
代码生成验证
Sin模块生成的代码是我们定义的代码名。
生成的代码也包含了main.h
总结
用这种方式可以结合手写代码,也可以把硬件资源用起来而不需要芯片和Matlab进行深度的集成,只是硬件接口需要保证接口函数的准确,不然生成的代码可能运行不正确,这里只举了一个例子,没有进行Cordic的验证。