了解生成的 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 提供了所有选项来自定义函数定义本身,以及单个信号在代码中出现的方式。
我有一个新手问题。我是编程新手,我成功地从 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 提供了所有选项来自定义函数定义本身,以及单个信号在代码中出现的方式。