如何将 simulink 中的数组结构提供给自定义 C 代码函数?
How to give a structure with arrays in simulink to a custom C code function?
我正在尝试为 Simulink 中的 C 函数提供结构。到目前为止我的步数:
在配置参数自定义代码中包含 .h
和 .c
。我的 header 有一个结构定义:
typedef struct mystruct
{ int m;
int *i;
double *x;}mystruct
现在在我的 Simulink 下的 MATLAB 函数中:
function y = fcn(u)%#codegen
m=int32(1);
i=zeros(10,1,'int32');
x=zeros(10,1);
s.m=m;
s.i=i;
s.x=x;
coder.cstructname(s,'mystruct','extern');
D=int32(0);
D=coder.ceval('accesmystruct',coder.ref(s));
y=10;
如果我 运行 代码,我从代码生成中得到一个很长的错误,表明它不能在 c-code 中编译。错误是:
c2_Test2.c
c2_Test2.c(57) : error C2143: syntax error : missing ')' before '*'
c2_Test2.c(57) : error C2081: 'cs_size' : name in formal parameter list illegal
c2_Test2.c(57) : error C2143: syntax error : missing '{' before '*'
c2_Test2.c(57) : error C2059: syntax error : ')'
c2_Test2.c(60) : error C2143: syntax error : missing ')' before '*'
....
这只有在我将两个变量 i
和 x
声明为指针时才会发生。如果我在 header 和 MATLAB 函数中将它们声明为标量,它就可以工作。
有人看到我做错了什么吗?
根据 cstructname 的文档,需要使用 'Headerfile'
输入参数指定头文件。
获取要编译的代码
为了获取要编译的代码,我添加了:
#include "mystruct.h"
在模拟目标->自定义代码->头文件部分。可能还需要在该窗格上添加所需的包含路径。
兼容性问题
完成上述操作后,代码在运行时崩溃。问题是 mystruct
的定义不是 MATLAB Coder 所期望的。
当您定义一个内部包含固定大小数组的 MATLAB 结构时,MATLAB Coder 生成的类型使用 C 结构内部的静态数组,例如:
typedef struct {
int32_T m;
int32_T i[10];
real_T x[10];
} mystruct;
如果从 coder.cstructname
调用中删除 'extern'
,您可以在 slprj
目录中的代码中看到这一点。
C 编译器已经为具有内联数组的结构分配了内存。但是,当字段是指针时,需要有人为数据分配space,这里没有做到。
我看到几个选项:
- 省略
'extern'
并允许 MATLAB Coder/Simulink 生成类型定义
- 为
i
和 x
用数组而不是指针声明你的外部结构
在写入或读取结构之前,将其传递给另一个为字段分配内存的 C 函数:
function y = fcn(u)
%#codegen
m=int32(1);
i=zeros(10,1,'int32');
x=zeros(10,1);
s = coder.nullcopy(struct('m',m,'i',i,'x',x));
coder.cstructname(s,'mystruct');
coder.ceval('initmystruct',coder.wref(s),int32(numel(i)),int32(numel(x)));
s.m=m;
s.i=i;
s.x=x;
在 C 中:
/* Example of initmystruct with no error checking */
/* int is the size type assuming it matches int32 */
/* in the MATLAB coder.ceval call */
void initmystruct (mystruct *s, int szi, int szx)
{
s->i = malloc(szi*sizeof(*s->i));
s->x = malloc(szx*sizeof(*s->x));
}
我正在尝试为 Simulink 中的 C 函数提供结构。到目前为止我的步数:
在配置参数自定义代码中包含
.h
和.c
。我的 header 有一个结构定义:typedef struct mystruct { int m; int *i; double *x;}mystruct
现在在我的 Simulink 下的 MATLAB 函数中:
function y = fcn(u)%#codegen m=int32(1); i=zeros(10,1,'int32'); x=zeros(10,1); s.m=m; s.i=i; s.x=x; coder.cstructname(s,'mystruct','extern'); D=int32(0); D=coder.ceval('accesmystruct',coder.ref(s)); y=10;
如果我 运行 代码,我从代码生成中得到一个很长的错误,表明它不能在 c-code 中编译。错误是:
c2_Test2.c
c2_Test2.c(57) : error C2143: syntax error : missing ')' before '*'
c2_Test2.c(57) : error C2081: 'cs_size' : name in formal parameter list illegal
c2_Test2.c(57) : error C2143: syntax error : missing '{' before '*'
c2_Test2.c(57) : error C2059: syntax error : ')'
c2_Test2.c(60) : error C2143: syntax error : missing ')' before '*'
....
这只有在我将两个变量 i
和 x
声明为指针时才会发生。如果我在 header 和 MATLAB 函数中将它们声明为标量,它就可以工作。
有人看到我做错了什么吗?
根据 cstructname 的文档,需要使用 'Headerfile'
输入参数指定头文件。
获取要编译的代码
为了获取要编译的代码,我添加了:
#include "mystruct.h"
在模拟目标->自定义代码->头文件部分。可能还需要在该窗格上添加所需的包含路径。
兼容性问题
完成上述操作后,代码在运行时崩溃。问题是 mystruct
的定义不是 MATLAB Coder 所期望的。
当您定义一个内部包含固定大小数组的 MATLAB 结构时,MATLAB Coder 生成的类型使用 C 结构内部的静态数组,例如:
typedef struct {
int32_T m;
int32_T i[10];
real_T x[10];
} mystruct;
如果从 coder.cstructname
调用中删除 'extern'
,您可以在 slprj
目录中的代码中看到这一点。
C 编译器已经为具有内联数组的结构分配了内存。但是,当字段是指针时,需要有人为数据分配space,这里没有做到。
我看到几个选项:
- 省略
'extern'
并允许 MATLAB Coder/Simulink 生成类型定义 - 为
i
和x
用数组而不是指针声明你的外部结构
在写入或读取结构之前,将其传递给另一个为字段分配内存的 C 函数:
function y = fcn(u) %#codegen m=int32(1); i=zeros(10,1,'int32'); x=zeros(10,1); s = coder.nullcopy(struct('m',m,'i',i,'x',x)); coder.cstructname(s,'mystruct'); coder.ceval('initmystruct',coder.wref(s),int32(numel(i)),int32(numel(x))); s.m=m; s.i=i; s.x=x;
在 C 中:
/* Example of initmystruct with no error checking */ /* int is the size type assuming it matches int32 */ /* in the MATLAB coder.ceval call */ void initmystruct (mystruct *s, int szi, int szx) { s->i = malloc(szi*sizeof(*s->i)); s->x = malloc(szx*sizeof(*s->x)); }