【问题标题】:Using Simulink Coder - atomic change of multidimensional parameters (matrix, vector)使用 Simulink Coder - 多维参数(矩阵、向量)的原子变化
【发布时间】:2015-08-22 16:04:19
【问题描述】:

我正在使用 Simulink 和 Simulink Coder 生成任意模型的 dll。我的 C 应用程序使用 mathworks CAPI。 它运行任意模型(硬实时低于 1 毫秒)并且能够修改模型的任何参数(通过使用可调参数)。

对于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 中的指针以激活第二个 地图。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。我处于实时状态,需要非阻塞解决方案,因此愿意不使用锁。我正在寻找适应生成的代码或围绕生成的代码编写包装器以完成任务的可能性。
    • 这种机制(自旋锁、互斥锁、信号量或其他任何名称)是实时设计的标准解决方案。诀窍是确保没有任务保持锁的时间超过必要时间并避免死锁。也许你需要更多地解释你的问题......除非所有周期都满足小于 1 ms 的硬性要求,否则会发生什么样的坏事?您必须使用哪种实时环境来保证您的实时任务不会因为数百人而没有资源?一旦我们了解了您的环境,就可以更轻松地向您介绍其机制。
    • Hard Real Time 与排名第一的性能无关 - 它与确定性/可预测性(执行时间)有关。我正在使用实时内核(Windows 扩展 - 来自 IntervalZero 的 RTX)。该应用程序通过电信号(数字和模拟)与外部世界进行通信。该模型可以实现为数字反馈控制器。要控制的植物的时间常数低于 1 毫秒。
    • 我同意性能和实时是不同的东西,硬实时意味着错过一个截止日期意味着整个系统故障。软实时错过最后期限意味着一个退化但不知何故仍然可用的系统。您的软件是否使用多个任务(可能具有不同的优先级)?如果没有,您将不需要任何互斥机制或原子函数,因为外部世界不会访问您的内存。我自己没有 RTX 的经验,也没有在他们的网站上找到关于他们的信号量机制的信息。
    • 需要某种锁定机制来避免线程1在更新参数过程中被中断时读取参数。也许您也可以通过使用指向某种双缓冲区的指针的原子更新来避免这种情况发生。如果您使用了一些锁并且有更多优先级在较低优先级线程 1 和较高优先级线程 2 之间的任务,您可能希望在获得锁之前提高任务 1 的优先级。否则,优先级介于任务 1 和任务 2 之间的任务可能会在任务 1 等待 CPU 时饿死等待锁定的任务 2。
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 2016-08-08
    • 2021-12-12
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2018-08-07
    相关资源
    最近更新 更多