了解生成的 C 代码。如何交换参数和 return 值?

Understanding generated C code. How to exchange arguments and return values?

我有一个新手问题。我是编程新手,我成功地从 Simulink 生成了我的第一个 C 代码。但是我不明白 Input 和 Output 是如何传递函数的。这个功能是如何工作的?它没有参数,也没有 return 值,但提供计算。主程序如何与此功能交互?

firstTest.c 生成初始化、步进和终止函数。步骤是计算。

 // firstTest.c
 void firstTest_step(void)
 {    
   Test_Y.Out = 2.0 + Test_U.In;
 }

firstTest.h生成对应的header文件到firstTest.c

// firstTest.h
extern void firstTest_step(void);

我的计划是在我自己的 C# 应用程序中以某种方式使用此功能。该解决方案可能包含 pinvoke 来处理非托管代码。因为我不理解这个函数,所以我试着玩了一下,发现可以自定义步进函数,以便代码生成器以我看到参数的方式从同一模型生成步进函数,我可以与之合作! (我什至不知道这是否有必要?)。所以第二个测试看起来像这样:

// secondTest.c
void secondTest_step(real_T In, real_T *Out)
    {     
      *Out = 2.0 + In;
    }

生成的header文件到这个:

// secondTest.h
extern void secondTest_step(real_T In, real_T *Out);

现在,Simulink 提供了生成 C DLL 的可能性。所以这就是我成功尝试的方法,我只需要根据 mathworks/simulink 文档将 header 修改为 __declspec。现在,我的代码如下所示:

// The DLL in which __declspec(dllexport) is a custom modification
__declspec(dllexport) void secondTest(real_T In, real_T *Out)

secondTest 是与外部应用程序交换数据的正确方法吗,它想要使用简单的步骤功能 (out = in + 2)?我最大的困惑仍然是 void-void 函数。我可以理解您也可以通过带有指针的函数传递参数,而不是 'normal' 参数。但是我没看到生成的函数 firstTest.c 是如何工作的?它没有指针,也没有值作为参数,只有没有 return 值的计算。

在 firstTest 的情况下,输入结构 Test_U 和输出结构 Test_Y 是全局的,因此可以从您的 wrapper/integration 代码中设置它们。

默认设置允许生成独立的 exe,因此声明和定义了这些全局结构。所以通常生成的界面是定制的。这就是为什么 Simulink 提供了所有选项来自定义函数定义本身,以及单个信号在代码中出现的方式。