本文发表在 rolia.net 枫下论坛问题应该非常简单,可是我没想明白。
有一个USB接口的I/O设备,可以读取4路encoder信号,还有A/D输出,以及一些数字IO。我在这个设备上面实现了非常简单的4路电机控制器,其中每一路用到USB设备的一路encoder,A/D等。设备SDK提供底层函数,通过对寄存器的读写来操作I/O设备。
我开始想的很简单,定义了Controller类。在Controller类的设置速度、启动,停止等成员函数里面通过直接操作USB设备寄存器实现了相应功能。有一些controller共享的寄存器,我偷懒,就定义成全局变量,把指针传递给controller对象。这个味道就已经不太好了。
后来出现了问题,SDK的低层函数不是线程安全的。而我的程序是多线程的,需要加个锁。于是我增加了一个关键区锁(windows环境)。由于4个控制器都是基于同一个USB设备的,需要共享这个锁,于是我就想到了在controller 类里面把锁定义为静态变量,由所有controller对象共享。到这里我想到了静态成员函数的必要性问题,于是发了上个贴子。
下面是本贴真正的问题了:我发现应该有一个USB设备的类,在这个类上定义硬件资源,因为I/O等硬件资源本来就是属于USB设备的,只是分配给了不同的controller。更重要的是我的应用中需要不止一个USB设备。
问题是USB类和controller的关系是怎样的?我想到USB设备上实现了4个控制器,于是就在USB类里面定义了4个controller 对象。这个好像有点问题。现在,寄存器、锁等资源都改在USB类里面定义了。
(1) 这时候是不是应该把对低层函数的调用都放到USB类里面?这样好像更符合逻辑。如果这样,controller对象应该怎样调用这些函数哪?因为最终controller的功能要通过这些函数操作寄存器来实现。
我还没有这样做,我只是把关键区锁定义在USB类中,并且把锁的指针传递给controller对象,让他们共享这个锁。这样做应该是不对的,因为这样controller 和USB对象都要访问低层函数,显然不合理。
(2) Controller 类应该知道USB设备对象,因为它要知道它的功能是基于哪一个USB硬件实现的,这样,我是不是在构造controller对象的时候,要把USB对象的指针或引用作为参数传递给controller?这样做合理吗?我总觉得这个地方有点不对,有什么更好的办法?
这些问题对高手应该非常简单,请提供意见,谢谢。更多精彩文章及讨论,请光临枫下论坛 rolia.net