使用Simulink总线表示指针的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

如何将指针的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

然后,如果这是可能的,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);