我有C固件实现了modbus slave。一旦接收到我的RTU命令(比如func 03“寄存器读取”),我只需转到LUT并获取我需要返回的数据。我的数据结构是全球性的。我的数组看起来像这样:
int* modbusLUT[]={
&motorControl_t.counter.degrees,
&motorControl_t.counter.dir,
&glueControl_t.nozzle.temp,
&paintControl_t.hopper.level,
...
};
我建立了这样的modbus回复:
temp = *modbusLUT[startAddr+j];
...
这个单线程代码非常有效且效率很高。
我现在正在编写单独的C ++“系统管理器”代码,这些代码是必不可少的,它也必须像modbus slave一样。我打算将系统的机制包装成三个类。每个类都在堆上创建,并启动它的自己的线程等待来自main()的事件。像这样:
m_ptrMotorMachine = new CMotorMachine();
m_ptrGlueMachine = new CGlueMachine();
m_ptrPaintMachine = new CPaintMachine();
...
m_ptrGlueMachine->m_pThread->PostThreadMesageA(SW_PART_IN_PLACE,0,0);
我需要来自所有三个类的参数(成员变量),以便我的modbus处理程序可以访问和读/写它们......理想情况下就像上面的C数组一样。
那么,我怎样才能在C ++中安全地执行上述操作?需要锁吗?伪代码是这样的:
class CModBusSlave{
void initLUT()
{
int* modbusLUT[]={
&m_ptrMotorMachine->velocity,
&m_ptrMotorMachine->accel,
&m_ptrGlueMachine->psi,
&m_ptrPaintMachine->stroke,
...
};
};
};
非常感谢任何想法或替代设计。
答案 0 :(得分:0)
如果我理解了你的问题,你就不必实现某种线程安全机制,多线程你必须担心资源争用时,使用modbus协议你有单独的地址和注册地址,通信机制是基于答案/回复的,所以主人要求做某事,只有感兴趣的奴隶在笔记地址上做那件事。 您可以使用您的线程来处理信息并使用管理器来启动正确的线程。如果你严格遵守标准协议,那就没有并发性,你不必担心。 也许我们可以在确定你的线程将完全做什么时考虑一些事情。 如果你没有任何特殊问题,我认为你的单线程版本就足够了!