使用Simulink总线表示指针的C结构
如何将指针的C结构与使用Simulink总线表示指针的C结构,c,matlab,simulink,C,Matlab,Simulink,如何将指针的C结构与Simulink.Bus关联 假设我有一个C结构: typedef struct { int32_T *a; uint8_T *b; } Bus_X ; 那么 什么是“??”呢 我想在外部C代码中使用它,如下所示 Bus_X x_data = { &a_sig, &b_sig }; Bus_X* x_ptr = &x_data; 其中,x_ptr将在Simulink信号上导入外部INTERN 然后,如果这是可能的,Simulin
Simulink.Bus
关联
假设我有一个C结构:
typedef struct
{
int32_T *a;
uint8_T *b;
} Bus_X ;
那么
什么是“??”呢
我想在外部C代码中使用它,如下所示
Bus_X x_data = { &a_sig, &b_sig };
Bus_X* x_ptr = &x_data;
其中,x_ptr
将在Simulink信号上导入外部INTERN
然后,如果这是可能的,Simulink应该在生成的代码中发挥魔力,如:
*(x_ptr->a) = 42.0 ;
可以在Simulink总线中处理指针,它可以在生成代码的C中使用,也可以在S函数中使用,而不是在纯Simulink中使用 最后一个,我认为simulink有一个范例:从输入到输出的数据流。指针提供了将数据从输出总线向后设置到模块的可能性。这是不需要的,因此首先不支持总线中的指针。但是对于C环境中的解决方案,指针可能是一个关注点 在头文件中,应定义联合:
typedef结构MyBus\t{
联合体{int32 myRefBus_int[2];myRefBus*myRefBus;}/*未命名联合体*/;
//…更多的元素;
}MyBus代码>
Simulink总线定义应仅包含myRefBus_int元素作为2维int32数组。下一个主题是一个S函数,它将任何所需的总线转换为int32[]。如果输入是模型级的总线,则S函数具有指针作为输入。数组也作为指针表示。因此,S函数“Bus2ptr”在mex.c文件中具有以下定义:
static void mdlInitializeSizes(SimStruct *simstruct) {
ssSetInputPortWidth(simstruct, 0, 1);
ssSetInputPortDataType(simstruct, 0, DYNAMICALLY_TYPED);
ssSetOutputPortDataType(simstruct, 0, SS_INT32);
ssSetOutputPortWidth(simstruct, 0, 2);
}
static void mdlOutputs(SimStruct *simstruct, int_T tid)
{
void const*const* ptrs = ssGetInputPortSignalPtrs(simstruct, 0); //InputPtrsType, InputRealPtrsType etc.
void** x = (void**) ptrs[0];
int32* y = (int32*)ssGetOutputPortSignal(simstruct, 0);
int64 ptr = (int64)(*x);
y[0] = (int32)ptr;
y[1] = (int32)(ptr >>32); //assume little endian. It is proper for all PC processors.
}
使用了两个int32,因为它应该在64位PC上运行。tlc文件包含以下行:
%function Outputs(block, system) Output
%assign u1_ptr = LibBlockInputSignal(0, "", "", 0)
%assign y1_ptr = LibBlockOutputSignalAddr(0, "", "", 0)
*(int32*)(u1_ptr) = (int32)(u1_ptr);
对于32位目标系统,您只需要1个元素。使用此S函数,您可以将任何总线转换为int32阵列,并存储int32值,这是总线结构中的地址。从C级,您可以使用总线头结构中的另一个union元素
如果这个周末我有足够的时间,我会在我的网页上描述更多。然而,存储在那里的simulink一点也没有。但我将在下次为simulink打开一个演示角。很抱歉,我在调试时发现一个错误:正确的代码:static void mdlOutputs(…void const*x=ptrs[0];int32*y=(int32*)ssGetOutputPortSignal(simstruct,0);int64 ptr=(int64)(x)}我已经调试了使用tlc文件生成的代码,它运行得很好。但是我没有使用模拟级S函数存储在总线中的值。我现在已经调试并检查了它。
%function Outputs(block, system) Output
%assign u1_ptr = LibBlockInputSignal(0, "", "", 0)
%assign y1_ptr = LibBlockOutputSignalAddr(0, "", "", 0)
*(int32*)(u1_ptr) = (int32)(u1_ptr);