0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于VxWorks操作系统实现PC/104-CAN适配卡的驱动系统设计

电子设计 来源:单片机与嵌入式系统应用 作者:解月工,秦龙勇, 2020-09-08 17:51 次阅读

来源:单片机嵌入式系统应用,作者:解月工,秦龙勇,谢拴勤,彭卫东

1 PC/104-CAN适配卡的硬件结构

PC/104-CAN适配卡主要由CAN控制器(SJA1000)、光电隔离(6N137),收发驱动器(82C250)及译码电路组成。编程主要了解的是控制器SJA1000。CAN适配卡原理如图1所示。

基于VxWorks操作系统实现PC/104-CAN适配卡的驱动系统设计

2 CAN地址译码和中断选择

系统104主板的CPU为486DX,其对接口板访问有两种方式:内存映射和I/O访问。I/O寻址采用专门的指令,每次只能传送单个字节。内存映射方式可以访问较大的地址空间并且指令丰富,便于实现快速交换数据。本文讨论的CAN卡采用存映射模式工作,与486DX接口是104总线,它与 ISA总线兼容。对于Intel X86体系的CPU,ISA可以映射的空间为0xC8000~0xEFFFF。使用比较器和地址选择开关组成可选端口地址译码电路,通过开关选通内存映射基地址(C8000H、C9000H、CA000H、…、EF000H),以避免与其它器件冲突。CAN偏移地址分配如下:

00~FFH SJA1000的寄存器

100H~1FFH 对该范围内的任意地址进行写操作,均可导致CAN硬件复位。

SJA1000的INT引脚通过跳线选择IRQ3~7、IRQ9~12或IRQ15中的一个,避免与其它的适配卡冲突。

3 PC/104-CAN适配卡驱动实现

3.1 VxWorks驱动概述

VxWorks操作系统有两种方式实现驱动。第一种方式是,把设备驱动程序作为独立任务实现,直接在顶层任务中实现硬件操作,完成特有专用的驱动程序。第二种方式是,VxWorks的I/O系统将设备程序作为内核过程实现。这种方式便于实现I/O子系统的层次模型,便于文件系统一起把设备作为特殊文件处理,提供统一的管理、统一的界面和统一的使用方法,并把设备、文件及网络通信组织成为一致的更高层次的抽象,为用户提供统一的系统服务和用户接口。我们和这种驱动方式。

作为I/O系统和硬件设备之间的连接层,VxWorks驱动就是屏蔽硬件操作,为I/O系统提供服务。实现一个完整的驱动,必须了解VxWorks下I /O的三个基本元素:File、Driver和Dervice。File是为用户提供访问设备的统一接口;Driver是实现具体的基本控制函数,也就是实现I/O系统所需要的接口;而Device则是一个抽象的硬件设备,是一系列的结构体、变量和宏定义对实际物理设备的定义。一般而言,实现一个驱动应该有三个基本的步骤:①用编程语言完成对实际物理设备的抽象;②完成系统所需要的各类接口及自身的特殊接口;③将驱动集成到操作系统中。之后还有一些调试工作。

3.2 VxWorks I/O系统驱动程序框架

VxWorks为各种设备(包括字符设备、块设备、虚拟设备及网络设备)提供统一的访问接口,包括七种基本的I/O函数:open(filename、flags、mode),create(filename、flags),read(fd、&buf、 nBytes),write(fd、&buf、nBytes),ioctl(fd、command、arg),close(fd)及 remove(filename)。I/O系统所起的作用就是,把用户请求分配到与设备对应的驱动例程中去。VxWorks系统中有一个驱动程序列表,其形式如表1所列。

表1 设备驱动列表(调试时可利用iosDrvShow()查看)

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; ;/*驱动号码*/

typedef struct {

DEV_HDR pCANHDR; /*这个数据结构必须放在设备描述符的最初部分*/

/*其余与驱动有关数据*/

}CAN_DEV; /*CAN设备描述符*/

CAN_DEV can_chan_dev;

STATUS CanDrv(void){

完成驱动的一些初始化;

intconnect(); /*连接所选的IRQ与中断处理函数*/

sysIntEnablePIC(); /*486DX允许中断*/

drv_num=iosDrvInstall(CanOpen,NULL,CanOpen,CanClose,CanRead,CanWrite,CanIoctl);/*将设备驱动例程装入设备列表中*/

}

/*iosDrvInstall()将设备的CAN驱动例程加入设备驱动列表中,7个参数为7个驱动例程的进入点(entry point),如果没有某个例程,则传递NULL。*/

STATUS CanDevCreate(){

完成一些设备初始化

iosDevAdd (&Can_chan_dev.pCANHDR,“can0”,drv_num);/*将设备放入设备驱动列表中*/

}

int CanOpen(CAN_DEV *pCan_Dev,UBYTE *remainder,int flags){

CAN卡硬件复位

CAN卡关中断

CAN卡进入软件复位模式

设置CAN卡工作寄存器,如接收码寄存器和屏蔽码寄存器等

CAN卡开中断和进入操作模式

Return((int)pCan_Dev); /*注意必须返回设备描述结构指针*/

}

int CanRead(int CAN_DEV_ID,UBYTE * buf,int nBytes){

等待信号量(该信号量由中断处理例程释放)

从接收缓冲区读取数据

释放接收缓冲

返回接收数据数量

}

int CanWrite(int CAN_DEV_ID,UBYTE* buf,int nbyte){

查询发送缓冲是否可用

向发送缓冲区写数据

命令发送

查询发送完成标志

返回发送数据数量

}

void interrupt_handle_routin(int arg){

处理中断事件

发送(释放)信号量

}

限于篇幅,其它函数略。

5 CAN驱动调试

硬件驱动的调试是件十分麻烦的事,经验十分重要。这里简要介绍几个帮助调试的函数。

①可以调用iosDrvShow()、iosDevShow()及iosFdShow()查看相关内容,判断并将驱动及设备中入相应列表。

②使用logMsg()现实相关内容,以定位错误。

初期调试,示波器和信号灯是非常有用的,可以确定硬件的工作状况,从而有助于发现程序中的错误。

6 小结

笔者采用两种方式完成了CAN卡驱动。相对于第一种(笔者亦完成),第二种方式——VxWorks的I/O系统将设备程序作为内核过程实现,大大减少了系统的开销,实时性和可靠性有了很大的提高,并且为用户提供了统一的接口,使用十分方便。

开发驱动程序,辅助工具是非常有用的。Windows下的开发工具就比较多,而在VxWorks下开发驱动的工具相对较少。Windriver 是一款不错的开发工具,可以开发VxWorks下的驱动程序(也可以开发其它操作系统下的驱动程序)。正确、熟练地使用这些辅助工具,会使开发工作事半功倍。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7244

    浏览量

    142612
  • 控制器
    +关注

    关注

    112

    文章

    15029

    浏览量

    170360
  • 操作系统
    +关注

    关注

    37

    文章

    6204

    浏览量

    121728
收藏 人收藏

    评论

    相关推荐

    什么是VxWorks操作系统

    VxWorksVxWorks操作系统是美国WindRiver公司于1983年设计开发的一种实时操作系统VxWorks拥有良好的持续发展能力、高性能的内核以及良好的用户开发环境,在实时操作系统
    发表于 06-07 14:17

    VxWorks操作系统使用指南

    1. VxWorks操作系统概述1.1.VxWorks 操作系统简介1.2.VxWorks操作系统
    发表于 07-20 13:10

    VxWorks系统CompactPCI总线怎么控制?

    ,硬件平台为PC104+架构。这里提出一种VxWorks操作系统下ComPactPCI总线驱动程序的设计及
    发表于 08-29 06:13

    求一种CAN适配卡驱动程序的设计方案

    CAN总线技术CAN适配卡驱动程序的设计与实现基于WinCE环境的CAN
    发表于 04-23 06:43

    如何利用VxWorks操作系统实现PC/104-CAN适配卡驱动系统设计

    求一种基于VxWorks操作系统实现PC/104-CAN适配卡
    发表于 04-28 06:17

    嵌入式实时操作系统VxWorks中串口通信的实现

    嵌入式实时操作系统VxWorks中串口通信的实现
    发表于 03-29 12:27 19次下载

    VxWorksPC/104-CAN驱动程序设计

    详细介绍实时多任务操作系统VxWorks环境下驱动程序的设计原理;针对驱动程序实现的困难,给出VxWor
    发表于 04-16 09:40 12次下载

    基于USB的CAN适配卡的设计与实现

    本文论述了CAN 总线系统CAN 适配卡的重要作用,在分析其他CAN 适配卡
    发表于 08-05 09:16 16次下载

    Linux操作系统实现了在PC104 上的裁减和移植

    论文简要分析了Linux 操作系统启动过程,介绍了Busybox、MiniGUI 等优秀的嵌入式专用软件,以及以PC104 主板和CF(CompactFlash)卡构建带图象用户界面(GUI)的嵌入式Linux 操作系统
    发表于 06-24 15:37 31次下载

    基于WinCE环境的CAN适配卡驱动程序的设计与实现

    基于WinCE环境的CAN适配卡驱动程序的设计与实现 WinCE是一种为多种嵌入式系统和产品设计的紧凑、高效、可升级的
    发表于 10-26 09:04 907次阅读

    VxWorks操作系统指南

    1.VxWorks操作系统概述 4 1.1.VxWorks 操作系统简介 4 1.2.VxWorks操作
    发表于 05-27 16:45 72次下载

    PC104总线实现VxWorks板载支持包BSP

    设计开发了嵌入式实时操作系统VxWorks 的一种基于PC104 总线的板载支持包, 完成了相关的外围驱动程序设计和调试工作。
    发表于 09-07 16:09 54次下载
    <b class='flag-5'>PC104</b>总线<b class='flag-5'>实现</b><b class='flag-5'>VxWorks</b>板载支持包BSP

    基于WinCE环境的CAN适配卡驱动程序的设计与实现

    本文简要介绍了嵌入式实时操作系统WinCE环境下驱动程序的设计原理和CAN总线技术并详细分析了依托PC/104总线的
    发表于 03-29 14:25 3次下载

    嵌入式VxWorks实时操作系统中串口通信的实现

    嵌入式VxWorks实时操作系统中串口通信的实现
    发表于 08-31 16:03 7次下载
    嵌入式<b class='flag-5'>VxWorks</b>实时<b class='flag-5'>操作系统</b>中串口通信的<b class='flag-5'>实现</b>

    基于VxWorks操作系统下光纤通道通信软件的实现

    基于VxWorks操作系统下光纤通道通信软件的实现
    发表于 08-31 17:08 4次下载
    基于<b class='flag-5'>VxWorks</b><b class='flag-5'>操作系统</b>下光纤通道通信软件的<b class='flag-5'>实现</b>