VxWorks下PC/104-CAN驱动程序设计
I/O系统的可动态调用iosDrvInstall()函数将设备的驱动例程(即XXOpen()、XXClose()、XXRead()等)加入到设备驱动列表中,如图2所示。
同样,系统中有一个设备列表,每个设备对应于设备列表中的一项,每一项包括设备名称和设备驱动号,同时包括一个设备描述的结构。该结构第一个变量是DEV_HDR类型的变量DEV_HDR。
DEV_HDR的定义如下:
Typedef struct
{
DL_NODE node; /*设备列表节点*/
short drvNum; /*驱动号码*/
char *name; /*设备名*/
}DEV_HDR;
系统调用iosDevAdd(),可以将设备加入到设备列表中。系统中将驱动和设备联系起来的就是文件描述符列表,每个文件描述符列表除了包括驱动号、设备ID外,还包括文件名、可用标志和指向DEV_HDR的指针。系统每次成功执行open(),返回一个文件描述符,这样对于设备的read()、write()及ioctl()就可以通过文件描述符进行。
文件描述符表(调试时调用iosFdShow()查看)如下:
I/O系统的整体结构如图3所示。系统启动时(一般挂接在usrroot()),XXDrv()和XXDevCreade()便将设备及其驱动加入相应的列表中。
3.3 设备驱动程序的访问过程
下面以CAN驱动程序为例,说明驱动程序的访问过程。(假定设备名“/can/1”并且以CAN设备驱动程序为例,上述中的XX在这里用Can代替。)
①fd=open(“/can/1”,O_RDWR,0644)
②I/O系统在设备列表中寻找设备名为/can/1的设备项,找到相应的设备驱动号。
③I/O系统在文件描述符中保留一个文件描述符空间。
④I/O系统在设备驱动列表中找到对应的CanOpen(CAN_DEV*PCAN_DEV,UBYTE*remainder,int flags),该驱动例程返回设备描述符的指针。
⑤I/O系统将设备描述符的指针存储在文件描述符列表的Device ID,同时将对应的设备驱动号存储在文件描述符的Driver num项。最后I/O系统返回该描述符项的索引(即为fd)。
⑥这样应用程序中的read()和write()等函数调用就可以根据fd找到相应的设备驱动号,进而找到相应的驱动例程。
4 CAN驱动程序的实现
CAN驱动程序的实现即是完成下面七个函数的编写。下面简要介绍其完成的功能,并用伪指令进行说明。
int drv_num; ;/*驱动号码*/
《VxWorks下PC/104-CAN驱动程序设计(第2页)》