如何将 simulink 中的数组结构提供给自定义 C 代码函数?

How to give a structure with arrays in simulink to a custom C code function?

我正在尝试为 Simulink 中的 C 函数提供结构。到目前为止我的步数:

如果我 运行 代码,我从代码生成中得到一个很长的错误,表明它不能在 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 '*'   
   ....

这只有在我将两个变量 ix 声明为指针时才会发生。如果我在 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 生成类型定义
  • ix
  • 用数组而不是指针声明你的外部结构
  • 在写入或读取结构之前,将其传递给另一个为字段分配内存的 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));
    }