这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 致信yaopg师兄,多块pci板卡识别的问题

共16条 2/2 1 2 跳转至
菜鸟
2008-04-16 12:10:00     打赏
11楼

:::因为每次插卡的位置不同,就会造成同一块板卡的deviceid不一样,这样当上位机使用板卡时,就会将数据送给上次(板卡更换插槽前)使用该devcieid的板卡,会造成辨别不清使用哪块板卡。而导致发送数据到错误板卡。致使一些错误发生,请问该问题应如何解决?
:::


我想你是不是概念搞错了??DeviveID是在EEPROM里面设置的
也就是说我们生产出来的同一批东西
其DiveceID是一样的。
换不同的插槽,只是设备枚举的时候其实例号HINSTANCE 句柄是会改变的,具体说就是如果这一类的卡,只有一张插入PCI槽,以怎样的实例号启动都可以,但是你如果有多张,那么第一张卡以1为实例号,随后依次增加。
所以,你如果想插了多张卡,但是调换顺序后还能完全不变的外部接口的话,应该要结果转换,比如你原来在一二号插槽插入AB两张卡,现在1插槽插入B卡2插槽插入A卡了,应用程序可不你的AB卡,反正它认出你的vendorID和DEVICEID,然后就认为这个驱动可以符合你的硬件,所以实例1对应的就是1插槽的那张卡,不管你是A卡还是B卡
所以,对于需要多轴的应用,可以给客户详细说明,客户需要的第一张卡应该插哪个位置,也就是像你说的,如果外部的顺序是确定了,那么插卡顺序也是应该不能乱来的


菜鸟
2008-04-16 12:12:44     打赏
12楼
:::因为每次插卡的位置不同,就会造成同一块板卡的deviceid不一样,这样当上位机使用板卡时,就会将数据送给上次(板卡更换插槽前)使用该devcieid的板卡,会造成辨别不清使用哪块板卡。而导致发送数据到错误板卡。致使一些错误发生,请问该问题应如何解决?:::我想你是不是概念搞错了??DeviveID是在EEPROM里面设置的也就是说我们生产出来的同一批东西其DiveceID是一样的。换不同的插槽,只是设备枚举的时候其实例号HINSTANCE 句柄是会改变的,具体说就是如果这一类的卡,只有一张插入PCI槽,以怎样的实例号启动都可以,但是你如果有多张,那么第一张卡以1为实例号,随后依次增加。所以,你如果想插了多张卡,但是调换顺序后还能完全不变的外部接口的话,应该要结果转换,比如你原来在一二号插槽插入AB两张卡,现在1插槽插入B卡2插槽插入A卡了,应用程序可不你的AB卡,反正它认出你的vendorID和DEVICEID,然后就认为这个驱动可以符合你的硬件,所以实例1对应的就是1插槽的那张卡,不管你是A卡还是B卡所以,对于需要多轴的应用,可以给客户详细说明,客户需要的第一张卡应该插哪个位置,也就是像你说的,如果外部的顺序是确定了,那么插卡顺序也是应该不能乱来的

菜鸟
2008-04-16 20:29:20     打赏
13楼

Quote因为每次插卡的位置不同,就会造成同一块板卡的deviceid不一样,这样当上位机使用板卡时,就会将数据送给上次(板卡更换插槽前)使用该devcieid的板卡,会造成辨别不清使用哪块板卡。而导致发送数据到错误板卡。致使一些错误发生,请问该问题应如何解决?

我想你是不是概念搞错了??DeviveID是在EEPROM里面设置的也就是说我们生产出来的同一批东西其DiveceID是一样的。换不同的插槽,只是设备枚举的时候其实例号HINSTANCE 句柄是会改变的,具体说就是如果这一类的卡,只有一张插入PCI槽,以怎样的实例号启动都可以,但是你如果有多张,那么第一张卡以1为实例号,随后依次增加。
   所以,你如果想插了多张卡,但是调换顺序后还能完全不变的外部接口的话,比如你原来在一二号插槽插入AB两张卡,现在1插槽插入B卡2插槽插入A卡了,应用程序可不你的AB卡,反正它认出你的vendorID和DEVICEID,然后就认为这个驱动可以符合你的硬件,所以实例1对应的就是1插槽的那张卡,不管你是A卡还是B卡
所以,对于需要多轴的应用,可以给客户详细说明,客户需要的第一张卡应该插哪个位置,也就是像你说的,如果外部的顺序是确定了,那么插卡顺序也是应该不能调换的就像我推荐你看的资料,靠近电源的那块卡上的叫做123轴,第二张卡的叫456轴,如果你换位置,第一张卡上的那三个轴就被系统认为是123轴,如果你外围接的电机一类已经把它认为是456轴了,当然错了;所以要按照你插卡顺序决定实际顺序的
最后,我想补充:在使用驱动的时候,要取得句柄,这个句柄是通过GUID取的驱动来寻找设备类,而后采用具体的实例号来对应上具体这个设备类中的某个硬件设备。

有篇文章讲到:Solaris 内核允许一个驱动程序具有多个实例。每个实例都有自己的数据空间,但与其他实例共享文本和某些全局数据。设备是基于每个实例进行管理的。除非将驱动程序设计用于在内部处理任何故障转移,否则驱动程序应针对每个硬件使用单独的实例。一个插槽可能具有一个驱动程序的多个实例,例如,多功能卡。

我想这些系统都有共性的,就是驱动是为一类东西来实现接口的,不是为一个东西来实现接口的,所以它首先找类,然后就是具体的实例,像我们这种控制卡,没张卡就是一个实例。

希望对你有用,我也学习中,多指教


菜鸟
2008-04-16 20:31:24     打赏
14楼

Quote因为每次插卡的位置不同,就会造成同一块板卡的deviceid不一样,这样当上位机使用板卡时,就会将数据送给上次(板卡更换插槽前)使用该devcieid的板卡,会造成辨别不清使用哪块板卡。而导致发送数据到错误板卡。致使一些错误发生,请问该问题应如何解决?

我想你是不是概念搞错了??DeviveID是在EEPROM里面设置的也就是说我们生产出来的同一批东西其DiveceID是一样的。换不同的插槽,只是设备枚举的时候其实例号HINSTANCE 句柄是会改变的,具体说就是如果这一类的卡,只有一张插入PCI槽,以怎样的实例号启动都可以,但是你如果有多张,那么第一张卡以1为实例号,随后依次增加。
   所以,你如果想插了多张卡,但是调换顺序后还能完全不变的外部接口的话,比如你原来在一二号插槽插入AB两张卡,现在1插槽插入B卡2插槽插入A卡了,应用程序可不你的AB卡,反正它认出你的vendorID和DEVICEID,然后就认为这个驱动可以符合你的硬件,所以实例1对应的就是1插槽的那张卡,不管你是A卡还是B卡
所以,对于需要多轴的应用,可以给客户详细说明,客户需要的第一张卡应该插哪个位置,也就是像你说的,如果外部的顺序是确定了,那么插卡顺序也是应该不能调换的就像我推荐你看的资料,靠近电源的那块卡上的叫做123轴,第二张卡的叫456轴,如果你换位置,第一张卡上的那三个轴就被系统认为是123轴,如果你外围接的电机一类已经把它认为是456轴了,当然错了;所以要按照你插卡顺序决定实际顺序的
最后,我想补充:在使用驱动的时候,要取得句柄,这个句柄是通过GUID取的驱动来寻找设备类,而后采用具体的实例号来对应上具体这个设备类中的某个硬件设备。

有篇文章讲到:Solaris 内核允许一个驱动程序具有多个实例。每个实例都有自己的数据空间,但与其他实例共享文本和某些全局数据。设备是基于每个实例进行管理的。除非将驱动程序设计用于在内部处理任何故障转移,否则驱动程序应针对每个硬件使用单独的实例。一个插槽可能具有一个驱动程序的多个实例,例如,多功能卡。

我想这些系统都有共性的,就是驱动是为一类东西来实现接口的,不是为一个东西来实现接口的,所以它首先找类,然后就是具体的实例,像我们这种控制卡,没张卡就是一个实例。

希望对你有用,我也学习中,多指教


菜鸟
2008-04-17 14:56:17     打赏
15楼
  谢谢dingbinyun师兄,我明白了一些,不过我认为你最后举的例子更能启发我,可能使用共享内存会更合适。
  可是我想我去给板卡发送数据,怎样共享内存,才能让每块板卡都能收到自己需要的数据呢?我希望能够做成可无序插拔的系统,因为我用的是工控机。这样才比较实用。

菜鸟
2011-10-09 11:32:04     打赏
16楼

多块卡可以用一个驱动。 驱动在初始化的时候检测PCI插槽,将检测到的所有同类型的卡(句柄)按照编号存放到一个数组中,比如CARD[0]、CARD[1]。然后将相应的资源分配给对应的句柄。 
应用程序在访问不同的板卡时只需要下传一个参数CARD[nIndex]来确定是那块卡就可以了。


共16条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]