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

问题描述 投票:2回答:1

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

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

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

firstTest.h为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;
    }

生成的头文件:

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

现在,Simulink提供了生成C DLL的可能性。所以这就是我成功尝试的,我只需要根据mathworks / simulink文档用__declspec修改标题。现在,我的代码看起来像这样:

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

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

function dll simulink
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.