从MATLAB到嵌入式C代码的实现 下载本文

从MATLAB到嵌入式C代码的实现

从设想到硬件实现的鸿沟是许多从事嵌入式开发的工程师们都熟悉的问题。鉴于MATLAB本身的语言特点、强大的函数库和灵活性,算法开发人员经常在算法的概念设计阶段使用它。

随着设计发展到嵌入式应用阶段,真实环境下的实际限制就需要考虑。这往往需要手工地把MATLAB指令翻译成c代码。手工翻译就涉及将MATLAB中方便易行的矩阵计算用c重新实现,这最终导致了同样算法的不同语言版本。在这一阶段,用户需要在多次循环设计时面临验证不同版本的等效性这一额外负担。验证所花费的精力很快就超出开发人员的承受范围,导致设计不是过快固化就是偏离了最初的定义。

最近The MathWorks公司提供了解决该问题的工具。这个工具能够把一种已明确定义的MATLAB语言子集自动转化为嵌入式c代码,有效减少了MATLAB语言向c代码进行手工翻译的开发和验证成本。

在本篇文章中,我们首先回顾MATLAB在早期设计过程中一些有用的特点。接下来我们要检验从MATLAB“概念”代码人工编译到C代码的低效性,之后会介绍一种不同的工

作流程,即直接在MATLAB而不是使用c语言对嵌入式系统进行确切描述。

MATLAB和C代码特点比较

表1比较了MATLAB和c代码在前期开发中的特点。 把一段典型的MATLAB算法转化成嵌入式c代码,要涉及几个相关实现的要求:

?数据类型管理一在执行前必须定义数据类型。例如在图像处理中,一般用8位无符号整数表示像素值,在音频处理时,一般用16位符号整数表示采样值。而MATLAB中默认使用的64位双精度变量显然没有有效地利用内存。 ?内存静态分配-MATLAB在运行时无缝处理变量大小的动态变化。然而在嵌入式系统实际应用中,我们尽量避免动态内存分配,而是在使用之前给内存分配固定的大小和数据类型。

?降低计算复杂性和内存占用空间,在把高层算法映射到有限内存和计算资源的硬件上,嵌入式软件设计者会耗费大量精力,同时要保证程序的有效运行。这是一个把设计算法转化成目标处理器中的指令集合和数据定义的过程。 ?支持定点在嵌入式软件或硬件上运行程序,需要整个算法全部严格定义成定点数据类型。

工程师们一般会在把MATLAB算法改写成c代码的时候做这些调整,从而产生了我们前面所说的设计鸿沟。软件工程师在两者间进行翻译的时候,有可能会人工引入一些错误和数值上的改变。如果这些变动目的在于优化程序,算法的设计者就需要更改MATLAB程序从而使两者保持一致。但这个过程引入了不必要的工作量和产生错误的可能性。一种为嵌入式系统设计的基于嵌入式MATLAB的工作流程解决了这个问题。

由MATLAB程序生成嵌入式C代码

不同于其他MATLAB程序,嵌入式MATLAB语言不是对设计的抽象数学表述,它包含了高效嵌入式c指令所需要的所有细节。任何按照嵌入式MATLAB子集要求编写的MATLAB程序都能生成嵌入式c代码。

为确保MATLAB算法与嵌入式MATLAB子集的一致性,需要用户遵守MATLAB子集规定的过程:

?设置变量的数据类型一可以在MATLAB主程序或编译过程中设定数据类型。因为它允许一个单独的MATLAB函数产生多个使用不同的数据类型、维度和复杂度的c函数变量,因此在编译过程中设置数据类型更为方便。由于用户在