从 matlab 代码生成 c/c 代码。 -凯发官方首页
从 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 命令。
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.