c++ - 使用 Simulink Coder - 多维参数(矩阵、 vector )的原子变化

标签 c++ c matlab code-generation simulink

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

我想实现的是:

  1. 在我的应用程序中定义第二张 map (大小相同)。
  2. 在第二张 map 上写入所有新值。
  3. 仅更改 rtDataAddrMap 中的指针以激活第二个 map 。

一般问题: 如何实现原子地更改多维参数? 这样做的常规方法是什么? (代码生成选项等。)

具体问题:(如果我的方法是正确的) 改变矩阵数据指针的合理方案是什么?

最佳答案

当涉及到这种多维数组时,就调用在单个时钟周期内完成其工作(因此不可能中断)的指令而言,原子性是不可能实现的。相反,您将需要某种实时机制,如互斥锁或信号量来保护您的数据。互斥量和信号量建立在原子操作之上,保证两个进程不能同时使用相同的资源。

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

关于c++ - 使用 Simulink Coder - 多维参数(矩阵、 vector )的原子变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30704912/

相关文章:

matlab - MATLAB中直方图均衡功能的说明

matlab - 将带有标题的矩阵转换为 .txt 文件

C++:指针作为哈希表中的键

c++ - Pugixml - 解析具有前缀映射和不带前缀映射的命名空间

c++ - 在 OpenGL 中可视化 4D 对象

c++ - libespeak 在消息末尾发出额外的音节

c++ - 如何正确填充在堆上分配的二维数组?

c - 无法访问类型转换的虚空指针

c - 如何在不停止 C 中的父进程的情况下 fork 子进程

matlab - 生成具有特定秩的随机矩阵