|
|
- [原创]vxworks在2410上的串口驱动开发中的问题讨论
作者:searcher827 时间:2006-5-29 16:16:10
vxworks在2410上的串口驱动程序开发大讨论
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
作者:searcher827 时间:2006-5-29 16:16:32
上是vxworks bsp包中intergrator920t primeCellSio.c对中关于实现串口
驱动的一个关键函数XXIoctl()的定义.但在/h/sioLib.h中对该函数原型的定义如下:
typedef struct sio_drv_funcs SIO_DRV_FUNCS;
typedef struct sio_chan /* a serial channel */
{
SIO_DRV_FUNCS * pDrvFuncs;
/* device data */
} SIO_CHAN;
struct sio_drv_funcs /* driver functions */
{
int (*ioctl)
(
SIO_CHAN * pSioChan,
int cmd,
void * arg /* .............注意这里*/
);
..............
}
注意第三个参数这里的类型是void *,而在顶楼ambaIoctl()中的类型是int.
这样问题就出来了,再往下看:在顶楼ambaIoctl()函数中有如下几行语句:
pChan->baudRate = arg; ....................A
*(int *)arg = pChan->baudRate; ....................B
pChan->channelMode = arg; ....................C
*(int *)arg = pChan->channelMode; ....................D
*(int *)arg = SIO_MODE_INT | SIO_MODE_POLL; ..........E
显然A,C两处是把arg当成整型来对待,而B,D,E处是把arg 当成void*来处理.
一个变量怎能同时出现两种类型呢,对此深表怀疑.
对于这中二意性的处理,个人觉得只要在ambaIoctl()函数中将arg的类型
由int改为void *然后把A,C两处的arg改为*(int*) arg就可以把问题解决了.
但实事情况是网上流传的4510bsp包包括其他一些bsp包中也大都是这样处理的.
另外vxworks提供的bsp包应该是已经经过测试的.毕竟是一个商业软件.
但从学习的角度出发,这的确是个问题.不知大家对此有何看法.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|