使用Simulink Coder - 多维参数的原子变化(矩阵,向量)

时间:2015-06-08 08:56:39

标签: c++ c matlab code-generation simulink

我正在使用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.

我想要达到的目的是:

  1. 在我的应用程序中定义第二个地图(相同大小)。
  2. 在第二张地图上写下所有新值。
  3. 仅更改rtDataAddrMap中的指针以激活第二个 地图。
  4. 一般问题: 如何实现以原子方式更改多维参数? 常规方法是什么? (代码生成选项等。)

    具体问题:(如果我的方法是对的) 更改矩阵数据指针的合理解决方案是什么?

1 个答案:

答案 0 :(得分:0)

当涉及到这种多维数组时,无法实现在单个时钟周期内调用指令(因而无法中断)的意义上的原子。相反,您需要某种实时机制(如互斥锁或信号量)来保护您的数据。互斥体和信号量是基于原子操作构建的,这保证了两个进程不能同时使用相同的资源。

使用乒乓缓冲数据区的方法可能会提高性能。不幸的是,我没有足够的经验来自Mathworks生成的代码来告诉如何实现它。