阅读:1535回复:11
Xscal 串口驱动结构体问题
在PPC2003系统的串口驱动中,我们把三个UART的驱动都放在同一个dll中,所以在打开串口时,就会调用open函数,在这函数里面是通过它的IoBase来区分不同的Uart的,例如
if(pHWHead->IOBase == STUART_BASE_U_VIRTUAL) if(pHWHead->IOBase == BTUART_BASE_U_VIRTUAL) 但是有一点不明白,就是在init时,它是调用了init函数三次来初始化这三个Uart,结构体指针pHWHead被初始化三次,所以其成员IoBase应该是最后一次init的uart的iobase,所以每次调用open时,iobase的值应该一直是最后uart的呀,它怎么还能用它来判断呢? 不知道大家明不明白我的意思啊 简单一点说,我要用同一个uart实现两个com口的驱动(其中一个是虚拟的),那究竟怎么区分我open时调用的是哪个com口的驱动呢? |
|
沙发#
发布于:2005-01-24 10:56
在PPC2003系统的串口驱动中,我们把三个UART的驱动都放在同一个dll中,所以在打开串口时,就会调用open函数,在这函数里面是通过它的IoBase来区分不同的Uart的,例如 你在注册表里是不是配置了三个串口的注册表项啊?所以才被调用了三次啊 |
|
|
板凳#
发布于:2005-01-24 14:19
这个知道,不过我的意思是,IoBase的值是从注册表里读出来的,它这样连续三次init后,iobase的值应该是最后一次init后读出的值,例如是STUART吧,那么在调用open时,pHWHead->IOBase 就会是一直等于 STUART_BASE_U_VIRTUAL,怎么还能用来if(pHWHead->IOBase == BTUART_BASE_U_VIRTUAL)呢,怎么还会执行到这个if语句下面的内容呢?
|
|
地板#
发布于:2005-01-24 16:41
这个知道,不过我的意思是,IoBase的值是从注册表里读出来的,它这样连续三次init后,iobase的值应该是最后一次init后读出的值,例如是STUART吧,那么在调用open时,pHWHead->IOBase 就会是一直等于 STUART_BASE_U_VIRTUAL,怎么还能用来if(pHWHead->IOBase == BTUART_BASE_U_VIRTUAL)呢,怎么还会执行到这个if语句下面的内容呢? 我是这么理解的: (1)你是想用一个驱动来管理三个串口,那么这三个串口注册表项中的Prefix的值分别确定了串口的索引,三个值肯定是不一样的。 (2)你的驱动被初始化了三次,相当于被创建了三个实例,分别管理三个串口。当应用加载驱动时,只要指定是哪个串口就行了,如“COM1:”,“COM2:”,“COM3:”。 如果不对,还请高手指教! |
|
|
地下室#
发布于:2005-01-24 16:53
对啊,Application调用时就是根据COM1这个来打开的,可是在驱动的open函数里面,它怎么知道上层是打开的COM1呢,而不是COM2或其他?如果假设它可以靠index来判别
例如if(index==1) {//打开com1} if(index==2) {//打开com2} 那么这个正在使用的index是怎么获得的? |
|
5楼#
发布于:2005-01-25 08:39
对啊,Application调用时就是根据COM1这个来打开的,可是在驱动的open函数里面,它怎么知道上层是打开的COM1呢,而不是COM2或其他?如果假设它可以靠index来判别 我觉得这个应该是文件系统和设备管理器的任务,你不需要去理它。三个实例对应三个对应不同的设备,有不同的注册表配置。 |
|
|
论坛版主
|
6楼#
发布于:2005-01-25 13:44
你的XXX_OPEN函数需要返回不同的值给上层,用以区分不同的设备实例。那个pHWHead应该有三个副本。DLL的数据区默认被调用的所有进程各自创建一个副本,当然,也可以让所有的进程共享一个。
|
|
7楼#
发布于:2005-01-25 13:56
我觉得它是有三个副本,可是有一点不明白,open时的pHWHead指针是哪个副本的指针,从哪里获得这个指针的地址呢,它指向哪个副本啊?
|
|
论坛版主
|
8楼#
发布于:2005-01-25 14:30
每调用LOADLIBARY就会创建一个副本,从而隶属于不同的实例
|
|
9楼#
发布于:2005-01-25 16:38
我觉得它是有三个副本,可是有一点不明白,open时的pHWHead指针是哪个副本的指针,从哪里获得这个指针的地址呢,它指向哪个副本啊? 我再补充一下:)) (1)驱动起来之后,创建了三个驱动实例,同时创建了三个数据区副本分别用来保存对应设备的配置信息,但代码区是共享的。 (2)当应用加载驱动的时候,系统会根据你指定的设备名自动定位到对应的驱动实例,读写操作也是针对对应的数据区副本中的数据进行的,不会错误地操作其他设备的; (3)也就是说,在驱动中你无需关心pHWHead指针到底指向哪个驱动实例,处理方式和只有一个设备实例的情况是一样的,这一点我已经测试过了:) |
|
|
10楼#
发布于:2008-01-16 14:43
是通过三个类封状起来的,比如:FFUART,BTUART.STUART,不过生成一个.DLL,在驱动里有明确规定这三个串口对应哪个COM
|
|
11楼#
发布于:2008-01-17 15:14
晕倒,这个问题你仔细看看COM_OPEN就知道了,仔细看看吧
|
|