gpt4 book ai didi

c - 使用 Simulink Bus 表示指针的 C 结构

转载 作者:太空狗 更新时间:2023-10-29 15:41:52 25 4
gpt4 key购买 nike

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

假设我有 C 结构:

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

然后 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;

其中 x_ptr 将是 Simulink Signal 上的 ImportedExternPointer

然后,如果可能的话,Simulink 应该在生成的代码中像这样施展魔法:

*(x_ptr->a) = 42.0 ;

最佳答案

在 Simulink 总线中处理指针是可能的,它可以在生成代码的 C 中使用,或者在 S-Function 中使用,而不是在纯 Simulink 中使用。

最后一个,我觉得simulink有个范式:Data flow from input to output。指针提供了向后设置数据的可能性,从输出总线到模块。这是不希望的,因此首先不支持总线中的指针。但对于 C 环境中的解决方案,指针可能是一个兴趣点。

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

typedef struct MyBus_t {
union { int32 myRefBus_int[2];我的引用总线*我的引用总线; }/*未命名 union 体*/;
//... 更多元素;
} 我的巴士;

Simulink Bus 定义应仅包含 myRefBus_int 元素作为二维 int32 数组。下一个主题是 S-Function,它将任何所需的 Bus 转换为 int32[]。如果输入是模型级别的总线,则 S-Function 将指针作为输入。数组也显示为指针。因此,S-Function“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-Function,您可以将任何总线转换为 int32 数组,并将作为地址的 int32 值存储在总线结构中。从 C 级别开始,您可以在总线 header 结构中使用其他 union 元素。

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

关于c - 使用 Simulink Bus 表示指针的 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30408094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com