【发布时间】:2012-05-06 23:09:31
【问题描述】:
以下情况我需要帮助。
我的项目是使用 simulink 来模拟机器人。simulink 模型的输出是机器人在每个时间步的位置和扭矩。我的问题出在数据收集部分。我计划使用缓冲区来存储 simulink 输出,并使用 antoher matalb 函数访问同一个缓冲区以将数据从缓冲区中取出以进行在线数据分析。要求是simulink模型和matlab数据分析功能需要同时运行。而 matalb 数据分析函数决定何时将数据从缓冲区中取出。这就像一个生产者-消费者问题,其中 simulink 是生产者,而数据分析 matlab 函数充当消费者。
我的问题是如何保护缓冲区以实现互斥。我不想使用 To 工作区块,因为它仅在 simulink 暂停或停止时更新数据。我没有找到 matalb 或 simulink 提供的任何类似 smeaphore 或 mutex 的结构。我尝试了以下方法来解决问题,但都不起作用:
我曾尝试使用DSP工具箱中的队列和缓冲区块,这两个块提供互斥,但是在模拟过程中输出数据的大小发生了变化。基本上当matlab函数采集数据的时候,它会把此刻存储在缓冲区中的所有数据都取走。然后缓冲区块似乎在每个 simulink 时间步上一个一个地输出。
我尝试通过嵌入函数中的持久变量来实现队列。当 matalb 函数要收集数据时,它会翻转一个信号标志来告诉 simulink 将数据输出到工作区。但是在这种方法中,matalb 函数必须通过两次调用来获取数据。第一次调用翻转标志然后返回。接下来,第二次调用用于搜索工作空间以查找 simulink 输出的数据。这种方法被我的顾问拒绝了,因为它不优雅。
我认为RTW可以解决这个问题,但是simulink模型和matalb分析函数代码经常改变,所以出于调试的目的,我打算不把simulink改成C/C++。但我想知道我是否可以使用 C 来实现互斥锁并通过 simulink 和 Matlab 调用。如果答案是肯定的,那该怎么做呢?
我真的希望有人可以帮助我。任何建议表示赞赏。顺便说一下,我用的是Linux系统。
【问题讨论】:
标签: concurrency buffer simulink