|
原文 http://www.hirain.com/training/ArticleShow.asp?ArtID=2734
从MATLAB到嵌入式C
作者:Grant Martin 、Houman Zarrinkoub
观念探索的灵活性对于创新是非常重要的。一个新观念不能被应用到实际的系统中就只能是个观念。在经典的开发过程中,许多工程师、科学家和研究学者都信赖MATLAB语言的灵活性进行开发设计,但是在系统实现中,必须把高级的MATLAB算法转换为通用的C语言。
嵌入式MATLAB代码可以将MATLAB转换成C,使得开发和实现统一起来。嵌入式MATLAB是MATLAB科学计算语言的一个子集,它可以直接从MATLAB算法生成C代码。拥有了这个功能,开发团队可以从设计到实现都在同一个开发环境中、使用同样的设计资源和同样的开发语言。
缩小设计观念和实现间的差距
工程师可以采用这样一个成熟的开发流程来建立嵌入式系统:MATLAB开发设计,转化为C代码,根据目标硬件编译,逐步验证。
在转换为C代码时,有如下的限制:
优化协调处理器运行速度和存储容量限制
采用适当的数值表示方式(浮点或定点)
统一实时数据管理,比如缓冲、数据流和数据通道
手工将MATLAB代码转换为C代码带来很多问题。第一,设计和实现采用不同的工具和开发环境,给复杂的算法概念交流造成了困难;第二,C代码和MATLAB设计代码经常有偏差。这就意味着需要额外的步骤去验证设计代码和C代码是否是相同的,以及开发过程中没有引入手工代码错误。
另外,还经常需要写C代码测试连接和下载的合理,以及测试处理器上的其他数据结构。采用这些传统的方法比较繁琐,占用时间,并且耗费项目工程资源。采用嵌入式MATLAB代码,MATLAB的嵌入式算法和数据结构可以自动被转换成C。
为了充分说明设计观念和实现的联系,我们来看一个经典的MATLAB跟踪算法工具。
从嵌入式MATLAB代码生成C代码
Kalman滤波器是递归滤波器,它从一系列杂乱的测量结果中估计出一个动态线性系统的状态。它们被广泛的应用于各个领域,包括控制系统设计、信号处理和图像处理、雷达和声纳以及金融建模。
这个简单的跟踪算法在MATLAB中是一个名为kalmanf.m的文件(如图1)。
图1 Kalman滤波器的嵌入式MATLAB代码
这个算法使用了emlc自动转换为C,它是Real-time Workshop的一个命令行语句,可以从嵌入式MATLAB代码生成C代码。
语法结构是:
>>emlc -s cfg –eg{A,B,C,Q,R,u,t,yv}kalmanf.m
这些结构参数曾被用于定义代码生成工具和优化调整编译器。这些选项可以也可以在如图2中的GUI界面进行设定。
图2 嵌入式MATLAB代码配置代码生成参数的Real-Time Workshop的GUI界面
这个例子中的选项通过定义函数接口来设置函数变量的数据类型和维数。生成的C代码创建成为一个名为kalmanf.c的文件。
在MATLAB中,基于矩阵运算,算法被编写为17行紧凑的代码。与其等价的C代码采用for循环将标量运算组成矩阵运算,共有144行。
由于算法所有变量的数据类型在编译的时候被引用,设计者拥有针对不同的处理器,多种版本开发算法的灵活性。生成的C代码是可读的,并且它还包含了与原始MATLAB代码相同的注释,插入到算法的对应行中。这意味着你只需要拥有一份MATLAB 版本的设计方案,就可以进行反复设计。这个C代码是自动生成的,可以反映出任何的变化。
在图3中画出的是生成代码的结果。这些结果通过验证,说明与MATLAB的仿真代码相同。
图3 Kalman滤波器采用MATLAB和C代码的输出
MATLAB代码组合进Simulink和Stateflow模型
对于很多研发团队,一旦生成的C代码被应用到目标上,该C代码是与复杂的MATLAB代码和编译算法经过对比验证的,工作就完成了。
如果这个算法将要用到一个大型的更复杂的系统中,工程师可以通过配置预编译的算法函数模块来扩展工作流程,该模块的开发采用了Simulink模型和Stateflow图(如图4)的嵌入式MATLAB子集。这样,工程师就可以进行系统级的仿真并为实现应用生成C或者HDL代码。
嵌入式MATLAB贯穿在MATLAB、Simulink和Stateflow中。通过这种方式,使得算法开发和系统建模提高了工作效率,并且将开发和实现结合在一起。
图4 采用参考Kalman跟踪滤波器的嵌入式MATLAB函数模块搭建的Simulink雷达系统
注:嵌入式MATLAB子集包括270个以上的MATLAB操作和函数,包括信号处理工具箱、航空工具箱和定点工具箱的函数。它包括了MATLAB语言的特点,例如矩阵和和向量、实数和复数、结构、流程控制和注释。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|