用Simulink总线表示指针的C结构



如何将C指针结构与Simulink.Bus关联?

假设我有一个C结构体:

typedef struct 
{
    int32_T *a;
    uint8_T *b;
} Bus_X ;

then for Simulink.Bus.objectToCell

 { ...
           'Bus_X', ...
           'Bus.h', ...
           sprintf(''), ...
           'Imported', {...
           {'a', 1, '???', -1, 'real', 'Sample', 'Fixed'}; ...
           {'b', 1, '???', -1, 'real', 'Sample', 'Fixed'}; ...
           } ...
 } ...

"?"应该是什么?'

我想像在外部C代码中使用

一样使用它
Bus_X x_data = { &a_sig, &b_sig  };
Bus_X* x_ptr = &x_data;

在Simulink信号

x_ptrImportedExternPointer

然后,如果这是可能的,Simulink应该在生成的代码中做魔术,如:

*(x_ptr->a) = 42.0 ;

可以在Simulink总线中处理指针,这些指针可以在C语言生成的代码中使用,或者在s函数中使用,而不是在纯Simulink中使用。

最后一个,我认为simulink有一个范例:数据流从输入到输出。指针提供了向后设置数据的可能性,从输出总线到模块。这是不希望的,因此总线中的指针首先不被支持。但是对于c环境中的解决方案,指针可能是一个感兴趣的点。

在头文件中你应该定义一个联合:

typedef struct MyBus_t { union { int32 myRefBus_int[2]; MyRefBus* myRefBus; } /*unnamed union*/ ; //... some more elements; } MyBus;

Simulink Bus定义应该只包含myRefBus_int元素作为2维的int32数组。下一个主题是s函数,它将任何所需的总线转换为int32[]。如果输入是模型级的总线,则s函数将指针作为输入。数组也作为指针表示。因此s函数"Bus2ptr"在ext .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-array并存储int32值,这是总线结构中的地址。在C层,你可以在总线头结构体中使用另一个联合元素。

如果这个周末我有足够的时间,我会在我的网页www.vishia.org上描述更多。然而,那里没有任何关于simulink的信息。但是下次我会为simulink打开一个演示角

相关内容

  • 没有找到相关文章

最新更新