文档库 最新最全的文档下载
当前位置:文档库 › 从MATLAB代码生成独立c语言代码

从MATLAB代码生成独立c语言代码

从MATLAB代码生成独立c语言代码
从MATLAB代码生成独立c语言代码

Matlab 用help lsqcurvefit

MATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。

使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法;检查MATLAB 代码的兼容性(有些matlab代码语句并不能生成c/c++代码);产生最终使用的源代码或MEX。

利用MATLAB Coder生成c++代码,并在vs2008中验证:

一个简单的例子,两数相乘:

1、安装matlab2011a或者更新版本;

2、简单生成一个foo.m文件;

function c = foo(a, b)%#codegen

%This function muliplies a and b

c = a * b

其中,%#codegen可以防止出现警告错误

3、在命令窗口,输入mex -setpu,选中一个存在的编译器;

4、在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;

5、在New选项卡Name中输入一个工程名foo.prj;点击Ok,弹出MATLAB Coder MEX Function 对话框;

6、在Overview选项卡中,点击Add files,弹出对话框,选中foo.m打开;

7、单击变量a,选择Define by Example…,弹出MATLAB Coder Define by Example对话框,在MATLAB Expression中输入5,点击OK;同样变量b也进行相应操作,输入6;

8、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;

9、点击More settings,GeneralàLangu age选择C++;Interface选项中去掉所有选项;Close;

10、点击Build,进行编译;点击View report,弹出Code Generation Report对话框,此时,变量a、b、c会显示相应的变量信息;

11、利用vs2008建立一个控制台应用程序,将生成的相关文件foo.h、foo.cpp、rtwtypes.h、foo_types.h拷到相关目录下并添加到应用程序中;

12、在foo.cpp文件中添加#include “stdafx.h”;

13、test.cpp文件中代码为:

#include "stdafx.h"

#include "foo.h"

#include

using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {

double a = 0.0, b = 0.0, c = 0.0;

cin>>a>>b;

c = foo(a, b);

cout<<"c = "<

return 0;

}

一个复杂的例子,求一个数的n次方根:

1、两个.m文件:

nrt.m:

function [nth_rt, iterations, hstry] = nrt(varargin)%#codegen %This function will use a Newton Search Technique to find %the nth root of a number, a, to the tolerance, tol.

%The square root

% nrt(10, 2), or nrt(10, 2, 1e-9)

%The "n" root

%nrt(10, n), or nrt(10, n, 1e-9)

a = varargin{1};

n = varargin{2};

if nargin ~= 3

tol = 1e-9;

else

tol = varargin{3};

end

if a < 0

iterations = 0;

hstry = 0;

else

[nth_rt, hstry] = newtonSearchAlgorithm(a, n, tol);

iterations = length(find(hstry ~= 0));

%iterations = sum(hstry ~= 0);

end

newtonSearchAlgorithm.m:

function [x, h] = newtonSearchAlgorithm(b, n, tol) %#codegen %Given, "a", this function finds the nth root of a

%number by finding where: x^n-a = 0

coder.inline('never'); %使其生成一个单独的c++文件notDone = 1;

aNew = 0; %Refined Guess Initialization

a = 1; %Initial Guess

cnt = 0;

h = zeros(50, 1);

h(1) = a;

while notDone

[curVal, slope] = f_and_df(a, b, n); % square

yint = curVal - slope * a;

aNew = -yint / slope; %The new guess

h(cnt) = aNew;

if (abs(aNew-a) < tol) %Break if it's converged notDone = 0;

elseif cnt > 49 %after 50 iterations, stop

notDone = 0;

aNew = 0;

else

a = aNew;

end

end

x = aNew;

function [f, df] = f_and_df(a, b, n)

%Our function is f=a^n-b and it's derivative is n*a^(n-1).

f = a^n-b;

df = n*a^(n-1);

2、在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;

3、在New选项卡Name中输入一个工程名nrt.prj;点击Ok,弹出MATLAB Coder MEX Function对话框;

4、在Overview选项卡中,点击Add files,弹出对话框,选中nrt.m打开;

5、添加三个输入,分别为10、2、1e-9;两个输入也可以;

6、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;

7、点击More settings,General-->Language选择C++;Interface选项中去掉所有选项;Close;

8、点击Build,进行编译;点击View report,弹出Code Generation Report对话框;

9、利用vs2008建立一个控制台应用程序,将生成的相关文件nrt.cpp、nrt.h、newtonSearchAlgorithm.cpp、newtonSearchAlgorithm.h、nrt_types.h、rtwtypes.h拷到相关目录下并添加到应用程序中;

10、分别在nrt.cpp、newtonSearchAlgorithm.cpp文件中添加#include “stdafx.h”;

11、test.cpp文件中代码为:

#include "stdafx.h"

#include "nrt.h"

#include

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

double varargin_1 = 0, varargin_2 = 0, varargin_3 = 1e-9;

cin>>varargin_1>>varargin_2;

double nth_rt = 0, iterations = 0;

double hstry_data[50] = {0};

int hstry_sizes[1] = {0};

nrt(varargin_1, varargin_2, varargin_3, &nth_rt, &iterations, hstry_data, hstry_sizes);

cout<<"nth_rt = "<

cout<<"iterations = "<

cout<<"hstry_data = "<

for (int i=0; i<50; i++)

{

cout<

}

cout<<"hstry_sizes = "<

return 0;

}

一种基于Matlab的DSP调试及直接代码生成方法

https://www.wendangku.net/doc/b8431151.html,/p-21683359.html 一种基于Matlab的DSP调试及直接代码生成方法 Matlab作为一种有效的信号处理工具,已经渗透到DSP的设计当中。开发者在将一个新的数字信号处理算法应用于实际前,一般是先用Matlab进行模拟验证,当模拟结果满意时再把算法修改成C或DSP汇编语言通过CCS在目标DSP上实现,并比较实际应用与模拟的结果以发现误差,如此反复进行。在较新版本的Matlab(6.0以上)中提供了Matlab与DSP的统一集成环境后,众多学者对Matlab环境下的DSP调试进行了研究。文献[2-4]从CCSLink的角度出发,对Matlab环境下的DSP调试进行了原理及思路上的阐述,但均未涉及到直接代码生成。本文在介绍CCSLink的连接对象、嵌入式对象和RTDX对象的基础上,详细阐述Simulink环境下的直接代码生成。 1 CCSLink及ETTIC2000概述 Matlab具有强大的分析、计算和可视化功能,但处理速度慢;DSP具有快速的信号处理能力,但是其CCS的编译环境中数据可编辑和分析能力不如Matlab;而MathWorks公司和TI公司联合开发的Matlab Linkfor CCS Development Tools(CCSLink)和EmbeddedTarget for the TI TMS320C2000 DSP Platform(ETTIC2000),CCSLink提供了Matlab和CCS的接口,能把Matlab和TI CCS及目标DSP连接起来。利用此工具可以像操作Matlab变量一样来操作TI DSP的存储器或寄存器。CCSLink支持CCS能够识别的任何目标板(C200,C5000,C600),此工具用于DSP程序的调试过程。而CCSLink与ETTIC2000的配合使用,可直接由Matlab的Simulink模型生成TIC2000DSP 的可执行代码,能在集成、统一的Matlab环境下完成DSP的整个开发过程。 2 CCSLink环境下的DSP调试 CCSLink向用户提供了3个组件内容,如图1所示。

一种基于Matlab的DSP调试及直接代码生成方法.

一种基于Matlab的DSP调试及直接代码生成方法 Matlab作为一种有效的信号处理工具,已经渗透到DSP的设计当中。开发者在将一个新的数字信号处理算法应用于实际前,一般是先用Matlab进行模拟验证,当模拟结果满意时再把算法修改成C或DSP汇编语言通过CCS在目标DSP 上实现,并比较实际应用与模拟的结果以发现误差,如此反复进行。在较新版本的Matlab(6.0以上)中提供了Matlab与DSP的统一集成环境后,众多学者对Matlab环境下的DSP调试进行了研究。文献[2-4]从CCSLink的角度出发,对Matl Matlab作为一种有效的信号处理工具,已经渗透到DSP的设计当中。开发者在将一个新的数字信号处理算法应用于实际前,一般是先用Matlab进行模拟验证,当模拟结果满意时再把算法修改成C或DSP汇编语言通过CCS在目标DSP 上实现,并比较实际应用与模拟的结果以发现误差,如此反复进行。在较新版本的Matlab(6.0以上)中提供了Matlab与DSP的统一集成环境后,众多学者对Matlab环境下的DSP调试进行了研究。文献[2-4]从CCSLink的角度出发,对Matlab环境下的DSP调试进行了原理及思路上的阐述,但均未涉及到直接代码生成。本文在介绍CCSLink的连接对象、嵌入式对象和RTDX对象的基础上,详细阐述Simulink环境下的直接代码生成。 1 CCSLink及ET TIC2000概述 Matlab具有强大的分析、计算和可视化功能,但处理速度慢;DSP具有快速的信号处理能力,但是其CCS的编译环境中数据可编辑和分析能力不如Matlab;而MathWorks公司和TI公司联合开发的Matlab Linkfor CCS Development Tools(CCSLink)和EmbeddedTarget for the TI TMS320C2000 DSP Platform(ETTIC2000),CCSLink提供了Matlab和CCS的接口,能把Matlab和TI CCS及目标DSP连接起来。利用此工具可以像操作Matlab变量一样来操作TI DSP的存储器或寄存器。CCSLink支持CCS能够识别的任何目标板(C200,C5000,C600),此工具用于DSP程序的调试过程。而CCSLink与ETTIC2000的配合使用,可直接由Matlab的Simulink模型生成TIC2000DSP的可执行代码,能在集成、统一的Matlab环境下完成DSP的整个开发过程。 2 CCSLink环境下的DSP调试 CCSLink向用户提供了3个组件内容,如图1所示。

基于Matlab2011a的DSP_TMS320F28027代码开发

基于Matlab/Simulink的DSP-TMS320F28027代码开发 TMS320F28027通用的源代码开发可以采用两种方法:一种是直接利用其提供的汇编指令编写源代码,然后经过汇编器和链接器进行汇编链接后生成目标可执行代码;另一种方法是利用标准的C/C++语言编写源代码,然后经C/C++编译器、汇编器和链接器进行编译链接,最后生成目标可执行代码。这两种代码开发方法都使得开发人员不得不花费大量的时间在代码的编写上面,增大开发难度,延长开发周期,从而影响开发效率。对于不熟悉TMS320F28027的开发人员,更是有碍于在完成控制算法后进行系统物理实现。 MathWorks公司最近推出了针对应用控制系统开发的嵌入式目标模块Embedded Coder。Embedded Coder可以生成可读、紧凑且快速的C和C++代码,以便用于嵌入式处理器。本课题的部分源代码是由Embedded Coder产生的,使用Embedded Coder生成TMS320F28027的嵌入式代码的方法如下。 步骤一:安装和配置软件。 (一)安装软件 安装软件之前卸载Embedded Coder不支持的第三方软件,这样可以防止环境变量指向不支持的软件而发生错误。 1、安装必须的和可选的MathWorks软件,因为从Matlab2010b开始支持TMS320F28027,所以应安装2010b版本以上的Matlab,此外要安装Embedded Coder、Real-Time workshop工具箱。 2、安装TI Code Composer Studio (CCS),因为从CCS3.3开始支持TMS320F28027,因此因安装3.3版本的CCS。 3、如果要固化程序到Flash存储器,安装TI Flash API、F28xx On-chip flash programmer。 (二)配置软件 按如下方法配置CCS: 1、进入CCS,打开Help > About > Component manager > Build tools > TMS320C28XX选择C2000Code Generation Tools。 2、打开Target Content(DSP/BIOS) > TMS320C28XX选择Texas

从Matlab-Simulink生成易读可重用代码

从Matlab-Simulink生成易读可重用代码

1)

2)

3)长,离散,可调参数,ERT目标,C语言,设置基本固定,未设置的地方保持默认。 →solver options: type -- Fixed step. solver -- Discrete. →optimization->signals and parameters: ●Default parameter behavior -- tunable. ●Pass reusable subsystem outputs as --输出较多选用structure reference. →hardware implementation: 按实际设hardware board, device, device details. →code generation: ●System target file -- ert.tlc, Language -- C, generate code only. code generation objectives. comments: include comments, 默认全选,可按需要选择。 symbols: 命名规则设置,按各自代码规范设置。

interface: 设置整个模型生成代码的接口。 ?code interface package,可选择可重 用,Pass root level I/O as,模型输入输出参数一般较多,一般选择结构体,structure reference,模型数据、输入、输出通过各自独立结构体传入参数;part of model data structure,一个结构体传入参数。也可选择不可重用。 ?configure model functions,点击进 入,设置模型具体的C原型。get default configuration,可修改模型默认initialize/step函数名,及参数,各输入输出单独作为函数参数,这与结构体传参是矛盾的,不能同时设置。 code style: 设置代码风格。 ?Parentheses括号,-- Nominal(readability),按可读性优化。 ?Casting mode 强制转换方式,Nominal.

基于模型设计—自动代码生成之硬件驱动

声明:本文是《基于模型设计—自定义目标系统配置指南》的续集,主要和大家分享RTW工具箱做自动代码生成时,硬件驱动的编写方法;本文涉及两方面的技术难点CMEX S函数和TLC文件的编写,对这两方面不熟悉的童鞋可以先看看相关的Help 文档。 通过硬件驱动模块和上层控制模块的结合,可以实现嵌入式系统C代码的一键式生成,所生成的代码无需做任何修改就可以直接下载到单片机中。 本教程开发环境如下:Matlab2010a+CodeWarrior V6.3+Mc9s08dz60 欢迎汽车电子工程师加入QQ群:89462451,讨论Matlab在汽车行业的应用,分享自己的独门经验。 中断、IO、ADC、TPM、CAN、CCP、MCG……下一个模块硬件驱动,你也可以~~~ tntuyh@https://www.wendangku.net/doc/b8431151.html, Godman2011.8.20 附件列表: dz60——该文件夹为自定义目标系统文件 系统TLC文件、主函数TLC文件、_file_processTLC文件、_callback_handler 文件、_make_rtw_hook文件、模块TLC文件(及C-Mex S函数) blocks——该文件夹为中断模块+数字输出模块的硬件驱动、 interrupt_init.c—中断模块C MEX S函数 interrupt_init.tlc—对应的TLC文件 dz60_dio_out.c—数字输出模块C MEX S函数 dz60_dio_out.tlc—对应的TLC文件 demos——该文件夹为测试用demo文件 interrupt_demo.mdl—测试模型,实现500ms和100ms任务 (33) 基于模型设计—自动代码生成之硬件驱动........................................................... 1、自定义目标创建 (3) 2、软件整体架构 (3) 3、硬件驱动编写 (5) 3.1主函数文件硬件驱动 (5) 3.2中断模块硬件驱动 (5) 3.3数字输出模块硬件驱动 (9)

从Matlab Simulink生成易读可重用代码

从Matlab Simulink生成易读可重用代码 by: 吴少风 MATLAB提供从MATLAB代码或simulink模型生成C/C++代码的功能。从MATLAB 2011b版开始,MA TLAB将代码生成Coder作为单独模块发布。MATLAB每年更新两次,经过不断完善,新版本的Coder功能更强大。用MATLAB生成C/C++代码具有MATLAB Coder、Simulink Coder、Embedded Coder三个功能模块,MA TLAB Coder从MA TLAB 代码生成代码,Simulink Coder从Simulink模型生成代码,Embedded Coder结合MATLAB Coder 和Simulink Coder,生成嵌入式代码。利用代码生成功能,可以快速从模型生成可靠的代码,应用越来越广泛。 要生成易于阅读、重用性好的代码,必须进行详细设置。文中内容以易读、可重用为目标,建立嵌入式代码生成的演示模型,了解Simulink代码生成相关工具,介绍详细设置步骤,最终生成容易阅读、可重用代码,供单处理器单任务实时嵌入式系统应用。文中的方法为严格控制生成代码的个人总结。以文档呈现,方便自己今后查看,也希望能为其他人提供一些方便。 1.简单示例 本部分搭建一个简单的PI控制器模型,示范模型建立、设置、生成代码的详细步骤。 1)新建嵌入式代码生成模型,MA TLAB->simulink,New / Embedded Coder / Code Generation System。不选择一般simulink模板,可减少模型配置参数的设置。 2)搭建如错误!未找到引用源。所示简易模型,保存文档,设置文件名。 图 1. 一个简单示例模型 3)点击工具栏图标,设置模型配置参数,应用并保存。对嵌入式应用,固定步长,离散,可调参数,ERT目标,C语言,设置基本固定,未设置的地方保持默认。 →solver options: type -- Fixed step. solver -- Discrete. →optimization->signals and parameters: ●Default parameter behavior -- tunable.

从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在运行时无缝处理变量大小的动态变化。然而在嵌入式系统实际应用中,我们尽量避免动态内存分配,而是在使用之前给内存分配固定的大小和数据类型。 ?降低计算复杂性和内存占用空间,在把高层算法映射到有限内存和计算资源的硬件上,嵌入式软件设计者会耗费大量精力,同时要保证程序的有效运行。这是一个把设计算法转化成目标处理器中的指令集合和数据定义的过程。 ?支持定点在嵌入式软件或硬件上运行程序,需要整个算法全部严格定义成定点数据类型。

simulink生成C代码

MATLAB控制系统仿真与嵌入式系统算法设计(原创) 2009-01-22 13:25:25| 分类:嵌入式系统与MATL|字号订阅 摘要:在控制类产品设计中,从仿真到工程实现一直是工程师追求的目标,本文将用几个实列来讨论这一过程,因为相当一部分工程师对单片机系统、Keil比较熟练,因此我采用对项目Simulink建模仿真后,就如何生成C代码,然后配合Keil 环境,从而以很小的工作代价把一些复杂的算法集成到单片机系统或嵌入式系统里运行,例子中包含有查询表、信号处理、模糊控制、神经网络、PID控制算法等。我将一个一个列子的来叙述. 关键词:模糊控制、查询表 1. 引言 2. 在Simulink环境下把查询表转化为8051兼容C代码 Fuzzylookup,样子如下: 图1-1模糊逻辑生成的查询表模型 2.1 设置Real-Time Workshop环境 点击Simulink\Tools\Real-Time Workshop\Options…,

图1-2 Real-Time Workshop 设置1 在上图的设置窗中,选择Real-Time Workshop项按上图设置,设置好后,选择Hardware Implement…,设置如下,点击Apply。 图1-3 Real-Time Workshop 设置2 选择Solver项,设置如下,点击Apply。

图1-4 Real-Time Workshop 设置3 1.2 生成8051兼容C代码并查看生成报告 点击Simulink\Tools\Real-Time Workshop\Build Model…,过几秒后,看到代码生成报告如下样子的界面: 图1-5 Real-Time Workshop 代码生成报告

相关文档
相关文档 最新文档