我在Matlab中定义了一个Bus对象,并将其传递给一个C S函数,该函数将进行一些处理。我在mdlInitializeSizes
中初始化输入如下:
#if defined(MATLAB_MEX_FILE)
if (ssGetSimMode(S) != SS_SIMMODE_SIZES_CALL_ONLY)
{
DTypeId dataTypeIdReg;
ssRegisterTypeFromNamedObject(S, BUS_OBJ_NAME, &dataTypeIdReg);
if(dataTypeIdReg == INVALID_DTYPE_ID) return;
ssSetInputPortDataType(S, 0, dataTypeIdReg);
}
#endif
ssSetInputPortWidth(S, 0, 1);
ssSetBusInputAsStruct(S, 0, 1);
ssSetInputPortDirectFeedThrough(S, 0, 1);
ssSetInputPortRequiredContiguous(S, 0, 1);
字符串
我还自动生成了一个C结构体,其中包含与Bus对象中的信号相同的变量。
总线中的一些信号也是总线,因此C结构体是递归生成的。举例来说:
struct myStruct
{
uint8_t var1[8];
uint32_t var2;
myOtherStruct1 var3;
myOtherStruct2 var4;
...
}
型
现在我想把Bus对象读入结构体。为此,我做到了:
const myStruct *busData = (const myStruct *) ssGetInputPortSignal(S, 0);
型
问题是busData没有var4
和以下变量的正确数据。如果我打印从ssGetInputPortSignal接收的原始数据,我可以找到我期望的数据,但它不在数组中的正确位置;相反,它有一些**填充。
因此我想问:
- 这是将Bus对象读入C S函数中的结构体的正确方法吗?
- 如何禁用填充,使所有数据都是连续的?
提前感谢!
2条答案
按热度按时间7gs2gvoe1#
我也有同样的问题。帮助我的是MathWorks提供的以下示例:
字符串
下面是一些代码片段,展示了如何根据上面的示例获取simulink总线对象的信息:
型
k97glaaz2#
Simulink在内存中以某种方式组织总线数据,其布局可能与相应的C结构不同。例如填充可以不同。因此,确保总线中的数据被放置在C结构中的正确位置的唯一方法是逐个元素的复制。
https://www.mathworks.com/matlabcentral/answers/595120-structure-output-from-s-function-getting-memcopy-ed-one-element-at-a-time-when-connecting-to-bus-por