我正在使用Simulink和Simulink Coder生成一个任意模型的dll。我的C应用程序使用数学工具CAPI。 它运行任意模型(硬实时低于1 ms)并且能够修改模型的任何参数(通过使用可调参数)。
对于simlpe标量值,我获得了值的地址。
伪代码:
void* simplegain = rtwCAPI_GetSignalAddrIdx()
*simplegain=42;
一切都运行良好。但是,如果我想要完整向量和矩阵的原子变化,则无法应用此方法。
对于多维数据,我使用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.
我想要达到的目的是:
rtDataAddrMap
中的指针以激活第二个
地图。一般问题: 如何实现以原子方式更改多维参数? 常规方法是什么? (代码生成选项等。)
具体问题:(如果我的方法是对的) 更改矩阵数据指针的合理解决方案是什么?
答案 0 :(得分:0)
当涉及到这种多维数组时,无法实现在单个时钟周期内调用指令(因而无法中断)的意义上的原子。相反,您需要某种实时机制(如互斥锁或信号量)来保护您的数据。互斥体和信号量是基于原子操作构建的,这保证了两个进程不能同时使用相同的资源。
使用乒乓缓冲数据区的方法可能会提高性能。不幸的是,我没有足够的经验来自Mathworks生成的代码来告诉如何实现它。