我正在使用 Simulink 和 Simulink Coder 生成任意模型的 dll。我的 C 应用程序使用 mathworks CAPI。 它运行任意模型(低于 1 毫秒的硬实时)并且能够修改模型的任何参数(通过使用可调参数)。
对于 simlpe 标量值,我正在获取值的地址。
伪代码:
void* simplegain = rtwCAPI_GetSignalAddrIdx()
*simplegain=42;
一切正常。但是,如果我想要完整 vector 和矩阵的原子变化,则无法应用此方法。
对于多维数据,我使用 memcopy 将目标中的所有值写入 GetSignalAddIdx()
的结果。测量表明使用 memcopy 会变慢。
分析生成的代码显示 rt_Lookup
real_T rt_Lookup(const real_T *x, int_T xlen, real_T u, const real_T *y)
// x is the pointer the matrix The Adress of the matrix is declared in a global structure `rtDataAddrMap` statically. I can read it out, but do not know how to change.
我想实现的是:
- 在我的应用程序中定义第二张 map (大小相同)。
- 在第二张 map 上写入所有新值。
- 仅更改
rtDataAddrMap
中的指针以激活第二个 map 。
一般问题: 如何实现原子地更改多维参数? 这样做的常规方法是什么? (代码生成选项等。)
具体问题:(如果我的方法是正确的) 改变矩阵数据指针的合理方案是什么?
最佳答案
当涉及到这种多维数组时,就调用在单个时钟周期内完成其工作(因此不可能中断)的指令而言,原子性是不可能实现的。相反,您将需要某种实时机制,如互斥锁或信号量来保护您的数据。互斥量和信号量建立在原子操作之上,保证两个进程不能同时使用相同的资源。
您的数据区域乒乓缓冲方法可能会提高性能。不幸的是,我没有足够的 Mathworks 生成代码经验来告诉我如何实现它。
关于c++ - 使用 Simulink Coder - 多维参数(矩阵、 vector )的原子变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30704912/