从 matlab 代码生成 c/c 代码。 -凯发k8网页登录
从 matlab 代码生成 c/c 代码。
语法
说明
codegen
使用带 options
function
-args {func_inputs
}func_inputs
类型输入的 matlab® 函数生成 c 或 c 代码,并编译生成的代码。使用 options
参数指定代码生成配置对象等设置。配置对象控制编译类型(mex、lib、dll 或 exe)和代码生成参数。有关创建和使用配置对象的信息,请参阅、,以及配置对象参考页:、 和 。
如果函数没有输入,请省略函数特定的 -args {
选项。func_inputs
}
codegen
从使用在外部 options
files
function
-args {func_inputs
}files
中指定的自定义源代码的 matlab 函数生成 c/c 代码。有关详细信息,请参阅和。
codegen
生成 c/c 代码,并控制从 matlab 函数生成的 c/c 函数代码的输出参数个数。文件和选项参数是可选的。如果并不需要 matlab 函数的所有输出,则请使用 options
files
function
-args {func_inputs
} -nargout number_args
-nargout
选项。有关详细信息,请参阅。
codegen
从 matlab coder™ 工程文件(例如 project
test.prj
)生成代码。
示例
从 matlab 函数生成一个 mex 函数。
编写一个 matlab 函数 mcadd
,它返回两个值的和。
function y = mcadd(u,v) %#codegen % the directive %#codegen indicates that the function % is intended for code generation y = u v; end
在 matlab 命令行中,运行以下 codegen
命令。
codegen mcadd -args {[0 0 0 0],0}
代码生成器在当前工作文件夹中生成 mex 文件 mcadd_mex
。
如果您没有指定编译目标,则代码生成默认为 mex 代码生成。默认情况下,代码生成器将生成的 mex 函数命名为
mcadd_mex
。要允许生成具有特定类型的 mex 或 c/c 代码,您必须指定 matlab 入口函数的所有输入变量的属性(类、大小和复/实性)。在此示例中,需要使用
-args
选项为输入提供示例值。代码生成器使用这些示例值来确定第一个输入是由double
类型的实数值组成的1
×4
数组,第二个输入是double
类型的实数标量。这些示例输入的实际值与代码生成无关。任何具有相同属性(类、大小和复/实性)的其他值对组都会生成相同的代码。请参阅。
在命令行中,调用生成的 mex 函数 mcadd_mex
。确保您传递给 mcadd_mex
的值的类、大小和复/实性与您在 codegen
命令中指定的输入属性相匹配。
mcadd_mex([1 1 1 1],5)
ans = 6 6 6 6
运行具有这些输入值的 matlab 函数 mcadd
会产生相同的输出。此测试用例验证 mcadd
和 mcadd_mex
具有相同的行为。
从具有多个签名的 matlab 函数生成 mex 函数
编写一个 matlab 函数 myadd
,它返回两个值的和。
function y = myadd(u,v) %#codegen y = u v; end
在 matlab 命令行中,运行以下 codegen
命令。
codegen -config:mex myadd.m -args {1,2} -args {int8(2),int8(3)} -args {1:10,1:10} -report
codegen
命令中指定的多个签名创建一个 mex 函数 myadd_mex
。有关详细信息,请参阅。在自定义文件夹中生成 c 静态库文件
编写一个 matlab 函数 mcadd
,它返回两个值的和。
function y = mcadd(u,v) %#codegen y = u v;
使用 -config:lib
选项在自定义文件夹 mcaddlib
中生成 c 库文件。将第一个输入类型指定为由无符号 16 位整数组成的 1×4 向量。将第二个输入指定为双精度标量。
codegen -d mcaddlib -config:lib mcadd -args {zeros(1,4,'uint16'),0}
生成可执行文件
编写一个 matlab 函数 coderrand
,该函数在开区间 (0,1) 上基于标准均匀分布生成一个随机标量值。
function r = coderrand() %#codegen r = rand();
编写一个 c 主函数 c:\myfiles\main.c
,它调用 coderrand
。
/* ** main.c */ #include#include #include "coderrand.h" #include "coderrand_initialize.h" #include "coderrand_terminate.h" int main() { coderrand_initialize(); printf("coderrand=%g\n", coderrand()); coderrand_terminate(); puts("press enter to quit:"); getchar(); return 0; }
将代码生成参数配置为包含 c 主函数,然后生成 c 可执行文件。
cfg = coder.config('exe') cfg.customsource = 'main.c' cfg.custominclude = 'c:\myfiles' codegen -config cfg coderrand
codegen
在当前文件夹中生成 c 可执行文件 coderrand.exe
,在默认文件夹 codegen\exe\coderrand
中生成支持文件。
此示例说明如何在配置对象 coder.codeconfig
中将主函数指定为参数。您也可以在命令行中单独指定包含 main()
的文件。您可以使用源、对象或库文件。
有关更详细的示例,请参阅。
生成使用可变大小输入的代码
编写一个接受单个输入的 matlab 函数。
function y = halfvalue(vector) %codegen y = 0.5 * vector; end
使用 coder.typeof
将输入类型定义为由双精度值组成的行向量,其最大大小为 1×16,第二个维度具有可变大小。
vectortype = coder.typeof(1, [1 16], [false true]);
生成 c 静态库。
codegen -config:lib halfvalue -args {vectortype}
使用全局数据生成代码
编写一个 matlab 函数 use_globals
,该函数接受一个输入参数 u
并使用两个全局变量 ar
和 b
。
function y = use_globals(u) %#codegen % turn off inlining to make % generated code easier to read coder.inline('never'); global ar; global b; ar(1) = u(1) b(1); y = ar * 2;
生成 mex 函数。默认情况下,codegen
在当前文件夹中生成名为 use_globals_mex
的 mex 函数。使用 -globals
选项在命令行指定全局变量的属性。通过使用 -args
选项,指定输入 u
为双精度实数标量。
codegen -globals {'ar', ones(4), 'b', [1 2 3 4]} use_globals -args {0}
您也可以在 matlab 工作区中初始化全局数据。在 matlab 提示符下,输入:
global ar b;
ar = ones(4);
b = [1 2 3];
生成 mex 函数。
codegen use_globals -args {0}
生成接受枚举类型输入的代码
编写一个函数 displaystate
,它使用枚举数据根据设备的状态来激活 led 显示。如果绿色 led 显示亮起,则指示 on 状态。如果红色 led 显示亮起,则指示 off 状态。
function led = displaystate(state) %#codegen if state == sysmode.on led = ledcolor.green; else led = ledcolor.red; end
定义一个 ledcolor
枚举。在 matlab 路径上,创建一个名为 'ledcolor' 的文件,其中包含:
classdef ledcolor < int32 enumeration green(1), red(2), end end
使用现有 matlab 枚举中的值创建一个 coder.enumtype
对象。
定义一个 sysmode
枚举。在 matlab 路径上,创建一个名为 'sysmode' 的文件,其中包含:
classdef sysmode < int32 enumeration off(0) on(1) end end
从这个枚举创建一个 coder.enumtype
对象。
t = coder.typeof(sysmode.off);
为 displaystate
生成一个 mex 函数。
codegen displaystate -args {t}
生成接受定点输入的静态库
编写一个 matlab 语言函数 mcsqrtfi
,用于计算定点输入的平方根。
function y = mcsqrtfi(x) %#codegen y = sqrt(x);
为定点输入 x
定义 numerictype
和 fimath
属性,并使用 -config:lib
选项为 mcsqrtfi
生成 c 库代码。
t = numerictype('wordlength',32, ... 'fractionlength',23, ... 'signed',true) f = fimath('summode','specifyprecision', ... 'sumwordlength',32, ... 'sumfractionlength',23, ... 'productmode','specifyprecision', ... 'productwordlength',32, ... 'productfractionlength',23) % define a fixed-point variable with these % numerictype and fimath properties myfiprops = {fi(4.0,t,f)} codegen -config:lib mcsqrtfi -args myfiprops
codegen
在默认文件夹 codegen/lib/mcsqrtfi
中生成 c 库和支持文件。生成接受半精度输入的静态 c 库
您可以为 matlab 代码生成接受半精度输入的代码。有关详细信息,请参阅 。
编写一个 matlab 函数 foo
,它返回两个值的和。
function y = foo(a,b) y = a b; end
在 matlab 命令行中,运行以下 codegen
命令。
codegen -lang:c -config:lib foo -args {half(0),half(0)} -report
code generation successful: view report
代码生成器在
中生成静态 c 库,其中 work
\codegen\lib\foo
是当前工作文件夹。work
要查看代码生成报告,请点击 view report
。在报告查看器中,检查文件 foo.cpp
中生成的 c 源代码。
real16_t foo(real16_t a, real16_t b) { return a b; }
生成的函数 foo
接受并返回半精度值。c 半精度类型 real16_t
在生成的头文件 rtwhalf.h
中定义。检查 real16_t
类的
运算符的定义。
此示例中生成的代码将半精度输入转换为单精度,以单精度执行加法运算,并将结果转换回半精度。
将浮点 matlab 代码转换为定点 c 代码。
此示例要求具有 fixed-point designer™。
编写一个 matlab 函数 myadd
,它返回两个值的和。
function y = myadd(u,v) %#codegen y = u v; end
编写一个 matlab 函数 myadd_test
以测试 myadd
。
function y = myadd_test %#codegen y = myadd(10,20); end
使用默认设置创建一个 coder.fixptconfig
对象 fixptcfg
。
fixptcfg = coder.config('fixpt');
设置测试平台名称。
fixptcfg.testbenchname = 'myadd_test';
创建一个代码生成配置对象来生成独立的 c 静态库。
cfg = coder.config('lib');
使用 -float2fixed
选项生成代码。
codegen -float2fixed fixptcfg -config cfg myadd
将 codegen
命令转换为等效的 matlab coder 工程
定义一个 matlab 函数 myadd
,它返回两个值的和。
function y = myadd(u,v) %#codegen y = u v; end
创建一个用于生成静态库的 coder.codeconfig
对象。将 targetlang
设置为 'c '
。
cfg = coder.config('lib'); cfg.targetlang = 'c ';
在 matlab 命令行中,创建并运行 codegen
命令。将 myadd
指定为入口函数。将 myadd
的输入指定为维度无界的 double
类型可变大小矩阵。将 cfg
指定为代码配置对象。包括 -toproject
选项,以将 codegen
命令转换为名称为 myadd_project.prj
的等效 matlab coder 工程文件。
codegen -config cfg myadd -args {coder.typeof(1,[inf,inf]),coder.typeof(1,[inf,inf])} -toproject myadd_project.prj
project file 'myadd_project.prj' was successfully created.
open project
代码生成器在当前工作文件夹中创建工程文件 myadd_project.prj
。使用 -toproject
选项运行 codegen
不会生成代码。它只创建工程文件。
使用另一个 codegen
命令,从 myadd_project.prj
生成代码。
codegen myadd_project.prj
代码生成器在
文件夹中生成 c 静态库函数 work
\codegen\lib\myaddmyadd
,其中
是您的当前工作目录。work
输入参数
options
— 代码生成选项
选项值 | 以空格分隔的选项值列表
在使用 codegen
命令时,单个命令行选项的优先级高于配置对象指定的选项。如果各命令行选项之间发生冲突,则最右边的选项优先。选项和其他语法元素的顺序是可互换的。
指定为以下一个或多个值:
-c | 生成 c/c 代码,但不调用 |
-config:dll | 使用默认配置参数生成动态 c/c 库。 |
-config:exe | 使用默认配置参数生成静态 c/c 可执行文件。 |
-config:lib | 使用默认配置参数生成静态 c/c 库。 |
-config:mex | 使用默认配置参数生成 mex 函数。 |
-config:single | 使用默认配置参数生成单精度 matlab 代码。 需要 fixed-point designer。 |
-config | 指定包含代码生成参数的配置对象。
有关详细信息,请参阅。 |
-d | 将生成的文件存储在
如果 如果不指定文件夹位置, codegen/target/fcn_name.
该函数不支持在文件夹名称中使用以下字符:星号 (*)、问号 (?)、美元符号 ($) 和镑符号 (#)。 注意 每次 |
-double2single | 使用
当与
有关详细信息,请参阅。您必须有 fixed-point designer 才能使用此选项。 |
-float2fixed | 当与
如果不使用 您必须将 fixptcfg.testbenchname = 'myadd_test'; myadd_test 是浮点到定点配置对象 fixptcfg 的测试文件。有关详细信息,请参阅。您必须有 fixed-point designer 才能使用此选项。 |
-g | 指定是否对 c 编译器使用调试选项。如果启用调试模式,c 编译器会禁用一些优化。编译速度会更快,但执行速度会变慢。 |
-globals | 在 matlab 文件中指定全局变量的名称和初始值。
{g1, init1, g2, init2, ..., gn, initn}
-globals {'g', 5} 也可以使用以下格式: -globals {global_var, {type, initial_value}}
在使用 matlab coder 和 matlab 各有自己的全局数据副本。为了保持一致性,只要两者有交互,就请同步其全局数据。如果不同步数据,其全局变量可能会不同。 要为全局变量指定常量值,请使用 -globals {'g', coder.constant(v)} g 为具有常量值 v 的全局变量。有关详细信息,请参阅。 |
-i | 将 如果路径包含非 7 位 ascii 字符(如日语字符),则 如果您的 'c:\project "c:\custom files"' |
-jit | 使用即时 (jit) 编译来生成 mex 函数。jit 编译可以加速 mex 函数的生成。此选项仅适用于 mex 函数生成。此选项与某些代码生成功能或选项不兼容,例如自定义代码或使用 openmp 库。 |
-lang:c | 将生成代码中要使用的语言指定为 c。 如果没有指定任何目标语言,代码生成器将生成 c 代码。 |
-lang:c | 将生成代码中要使用的语言指定为 c 。 |
-launchreport | 生成并打开一个代码生成报告。如果未指定此选项,则仅当出现错误或警告消息或者您指定了 |
-o | 使用基本名称
对于 mex 函数, 如果没有为库和可执行文件指定输出文件名,则基本名称是 |
-o | 根据
在命令行上为每次优化指定一次 如果没有指定,则 |
-package | 将生成的独立代码及其依存关系打包到名为 函数也提供此打包功能。 |
-preservearraydims | 生成使用 n 维索引的代码。有关详细信息,请参阅。 |
-profile | 使用 matlab 探查器启用对生成的 mex 函数的探查。有关详细信息,请参阅使用 matlab 探查器探查 mex 函数。 |
-report | 生成代码生成报告。如果未指定此选项,则仅当出现错误或警告消息或者您指定了 如果您有 embedded coder,则此选项还支持生成代码替换报告。 |
-reportinfo | 将有关代码生成的信息导出到 matlab 基础工作区的变量 |
-rowmajor | 生成使用行优先数组布局的代码。默认为列优先布局。有关详细信息,请参阅。 |
-silent | 如果代码生成成功且没有警告,则隐藏所有消息,包括生成报告时。 将显示警告和错误消息。 |
-singlec | 生成单精度 c/c 代码。有关详细信息,请参阅。 您必须有 fixed-point designer 才能使用此选项。 |
-std:c89/c90 | 为生成的代码使用 c89/90 (ansi) 语言标准。 |
-std:c99 | 为生成的代码使用 c99 (iso) 语言标准。 |
-std:c 03 | 为生成的代码使用 c 03 (iso) 语言标准。仅在生成 c 代码时才能使用此库。 |
-std:c 11 | 为生成的代码使用 c 11 (iso) 语言标准。仅在生成 c 代码时才能使用此库。 |
-test | 运行 仅当生成 mex 函数或使用将 |
-toproject | 将 您还可以使用 codegen -config cfg -toproject myprojecttemplate.prj myprojecttemplate.prj 不包含入口函数或输入类型的设定。因此,您无法从这个工程文件生成代码。您可以在 matlab coder 中打开 myprojecttemplate.prj ,并将其作为模板来创建可用于生成代码的完整工程文件。使用 请参阅。 |
-v | 启用详细模式以显示代码生成状态和目标编译日志消息。 |
-? | 显示 |
function
— 从其生成代码的 matlab 函数的名称
函数名称
指定为当前工作文件夹中或路径上存在的函数。如果 matlab 文件位于包含非 7 位 ascii 字符(如日语字符)的路径上,codegen
命令可能找不到该文件。
如果您正在使用 lcc 编译器,请不要将入口函数命名为 main
。
示例: codegen myaddfunction
func_inputs
— matlab 函数输入的示例值
表达式 | 可变 | 字面值 | coder.type
对象
定义前面的 matlab 函数输入的大小、类和复/实性的示例值。元胞数组中输入的位置必须对应于 matlab 函数定义中输入参数的位置。您也可以提供 coder.type
对象,而不是示例值。要创建 coder.type
对象,请使用 coder.typeof
。
要生成一个函数,且该函数的输入参数个数少于函数定义的参数个数,请省略不需要的参数示例值。
有关详细信息,请参阅。
示例: codegen foo -args {1}
示例: codegen foo2 -args {1, ones(3,5)}
示例: codegen foo3 -args {1, ones(3,5), coder.typeof("hello")}
files
— 自定义源文件的名称
文件名 | 以空格分隔的文件名列表
要包含在生成代码中的、以空格分隔的自定义文件列表。选项、外部文件和函数设定的顺序可以互换。您可以包括以下类型的文件:
c 文件 (
.c
)c 文件 (
.cpp
)头文件 (
.h
)目标文件(
.o
或.obj
)库(
.a
、.so
、.dylib
或.lib
)模板联编文件 (
.tmf
)注意
在以后的版本中将删除对模板联编文件 (tmf) 的支持。请改用工具链方法来编译生成的代码。
如果这些文件位于包含非 7 位 ascii 字符(如日语字符)的路径上,codegen
命令可能找不到这些文件。
示例: codegen foo mylib.lib
number_args
— 生成的入口函数中输出参数的数量
整数
为前面的 matlab 函数生成的 c/c 入口函数中的输出参数个数。代码生成器按照输出参数在 matlab 函数定义中出现的顺序生成指定数量的输出参数。
示例: codegen mymlfnwiththreeouts -nargout 2
project
— 工程文件名
文件名
从 matlab coder 创建的工程文件。代码生成器使用该工程文件来设置入口函数、输入类型定义和其他选项。要打开 app 并创建或修改工程文件,请使用 函数。
示例: codegen foo.prj
限制
您不能为 matlab 脚本生成代码。请将脚本重写为函数来生成代码。
不支持在当前文件夹是私有文件夹或 @ 文件夹时生成代码,因为这些文件夹在 matlab 中有特殊含义。您可以生成代码来调用 @ 文件夹中的方法和私有文件夹中的函数。
提示
默认情况下,代码是在文件夹
codegen/
中生成的。mex 函数和可执行文件被复制到当前工作文件夹。target
/function
为了简化代码生成过程,您可以在单独的脚本中编写代码生成命令。您在该脚本中定义您的函数输入类型和代码生成选项。要生成代码,请调用该脚本。
每次
codegen
为相同的代码或工程生成相同类型的输出时,都会删除上一次编译生成的文件。如果要保留以前的某次编译生成的文件,请在开始新的编译之前将这些文件复制到其他位置。使用 函数打开 matlab coder,并创建一个 matlab coder 工程。该 app 提供了用户界面,便于您添加 matlab 文件、定义输入参数和指定编译参数。
您可以使用函数语法调用
codegen
。将codegen
参数指定为字符向量或字符串标量。例如:codegen('myfunction','-args',{2 3},'-report')
要提供字符串标量作为输入或将
codegen
参数指定为字符串标量,请使用函数语法。例如:codegen('myfunction','-args',"mystring",'-report') codegen("myfunction","-args","mystring","-report")
向
codegen
的命令形式提供字符串标量输入可能会产生意外的结果。请参阅。要以编程方式调用
codegen
,请使用函数语法。例如:a = {'myfunction','-args',{2 3}}; codegen(a{:})
版本历史记录
在 r2011a 中推出
另请参阅
| coder.typeof
| (fixed-point designer) | (fixed-point designer) | | fi
(fixed-point designer) | | | | | |
主题
matlab 命令
您点击的链接对应于以下 matlab 命令:
请在 matlab 命令行窗口中直接输入以执行命令。web 浏览器不支持 matlab 命令。
select a web site
choose a web site to get translated content where available and see local events and offers. based on your location, we recommend that you select: .
you can also select a web site from the following list:
how to get best site performance
select the china site (in chinese or english) for best site performance. other mathworks country sites are not optimized for visits from your location.
americas
- (español)
- (english)
- (english)
europe
- (english)
- (english)
- (deutsch)
- (español)
- (english)
- (français)
- (english)
- (italiano)
- (english)
- (english)
- (english)
- (deutsch)
- (english)
- (english)
- switzerland
- (english)
asia pacific
- (english)
- (english)
- (english)
- 中国
- (日本語)
- (한국어)