杭州灵隐寺求什么最灵| 梦到抓了好多鱼是什么意思| 淋巴系统由什么组成| 赤脚走路有什么好处| 派大星是什么动物| 今天拉警报什么意思| 肠鸣是什么原因引起的| 两榜进士是什么意思| 肩周炎是什么症状| 520是什么日子| 木辛读什么| 三七粉什么颜色| ppi是什么| 10.5号是什么星座| 广西产什么水果| 发烧吃什么消炎药| 社保断了有什么影响| 吃头发的虫子叫什么| 梦见死去的姥姥是什么意思| 什么叫甲状腺弥漫病变| 前列腺实质回声欠均匀什么意思| 百无一用是什么意思| 至加秦是什么字| fc是什么| 西凤酒什么香型| 断章取义什么意思| 颞下颌关节挂什么科| 小孩咳嗽不能吃什么食物| 黑猫警长叫什么名字| 甲减不能吃什么东西| 来例假吃什么水果| 补肾壮阳吃什么| 心脏早搏吃什么药好| 老百姓是什么意思| da医学上是什么意思| 大学生村官是什么编制| 为什么心里老是想着死| 王不留行是什么| 莲花什么时候开| rsv是什么病毒| 腿经常抽筋是什么原因| 前列腺炎有什么症状| 现充是什么| 大便陶土色是什么颜色| 每天吃三颗红枣有什么好处| 明亮的什么| 过路车是什么意思| 英雄本色是什么意思| 奶茶喝多了有什么危害| 胃肠炎吃什么药好| 明前茶和明后茶有什么区别| 朝朝暮暮是什么意思| 绝经后吃什么能来月经| 红颜知己的意思是什么| 八字桃花是什么意思| 上呼吸道感染吃什么消炎药| 下午四五点是什么时辰| 镀18k金是什么意思| 羊水多了对宝宝有什么影响| 梦见自己尿裤子了是什么意思| 低热吃什么药| 垂体泌乳素高是什么原因| 动脉圆锥是什么意思| 饺子有什么馅| 鸡生肖配什么生肖最好| 1月7号什么星座| 十点半是什么时辰| 半边屁股疼是什么原因| 七月十日是什么星座| 蟒袍是什么人穿的| 电瓶车什么牌子好| 骨转移用什么药能治愈| 脾肺气虚吃什么中成药| 此地无银三百两是什么意思| 愣头青是什么意思| 间奏是什么意思| 平安夜什么时候吃苹果| 绸缪是什么意思| 吃什么提高免疫力和增强体质| 恶心头晕是什么症状| 什么是艾滋病| 水丸是什么意思| 商鞅姓什么| 希腊脚是什么意思| 脉弦是什么意思和症状| 汤姆福特属于什么档次| 生姜和红枣煮水喝有什么作用| 办理暂住证需要什么材料| 水手是什么意思| 肛门痒挂什么科检查| 鼻子突然流血是什么原因| 蜂蜜和什么不能一起吃| 夏季感冒吃什么药| 痛风要吃什么药好得快| 9月19日是什么星座| 穿裙子搭配什么鞋子| 什么是失信被执行人| 吕洞宾代表什么生肖| 荣字五行属什么| 新陈代谢慢是什么原因| 脸痒痒用什么方法可以缓解| 井里面一个点念什么| 厮守是什么意思| 头疼恶心吃什么药| 哀鸿遍野是什么意思| 霍金什么时候去世| 人流后吃什么恢复快| 天枢是什么意思| 梦见借给别人钱是什么意思| classic什么意思| 头疼嗓子疼吃什么药| 月子早餐吃什么好| 肉苁蓉是什么| bps是什么意思| 壶承是什么| 巧克力囊肿是什么意思| 无法无天是什么生肖| 天津副市长什么级别| eagle是什么牌子| 什么花粉| 阴道炎是什么原因引起的| 生酮是什么| 缓解是什么意思| 腹泻吃什么食物| 什么人生病从来不看医生| 异禀是什么意思| 睡觉手麻木是什么原因| 何乐而不为是什么意思| moi是什么意思| 荨麻疹涂什么药膏| 大脑记忆力下降是什么原因| 吃什么补白细胞快| 吉祥三宝是什么意思| 盐酸氯米帕明片有什么作用| 什么的田野| Urea医学上是什么意思| 面部油腻是什么原因| 鸭子为什么会游泳| 脊髓灰质炎是什么病| 类风湿吃什么药有效| 三月十五是什么星座| 心火是什么原因引起的| 糖尿病人不能吃什么水果| 失焦是什么意思| 胃溃疡能吃什么| 六味地黄丸什么人不能吃| 代表什么意思| 正月初九是什么星座| 奡是什么意思| 四不像长什么样| 扁平疣长什么样| 褶子是什么意思| 什么东西驱蛇效果最好| 什么是盆地| 寒酸是什么意思| 嬴姓赵氏是什么意思| 碳14阴性是什么意思| 自欺欺人是什么意思| 慕斯蛋糕是什么意思| 吃羊肉不能吃什么| 喝什么对肾好| 8月29日是什么星座| 吃烧烤后吃什么水果可以帮助排毒| 中堂相当于现在什么官| 孕妇为什么会水肿| 更年期失眠吃什么药| 吃藕粉对身体有什么好处| 便秘用什么药好| 为什么会长疤痕疙瘩| 湿疹用什么药膏最好| 小孩尿酸高是什么原因| 梦见搬家是什么预兆| lmy是什么意思| 祈福是什么意思| 孩子拉肚子吃什么食物好| 心颤是什么症状| wba是什么意思| 经期吃什么好| 骇人是什么意思| 白蛋白低吃什么| 银耳什么时候吃最好| 什么是尘肺病| 牛奶什么时间喝最佳| 睡觉空调开什么模式| 安德玛是什么牌子| vol是什么意思| 尿少尿黄是什么原因引起的| 美人坯子是什么意思| 打耳洞医院挂什么科| 肥皂剧是什么| 窦性心律不齐吃什么药| 高压偏低有什么危害| 王维是诗什么| 尿道炎吃什么药最好| 谁与争锋是什么意思| bm是什么牌子| 为什么会打哈欠| 洗礼是什么意思| 红斑狼疮是一种什么病| 胖大海是什么| 西瓜有什么营养和功效| 口腔医学是什么| 血管瘤有什么危害| 天团是什么意思| 一什么阳光填量词| 胃胀气有什么症状| 感冒发烧挂什么科| 来大姨妈能吃什么水果| 值神天刑是什么意思| 理想血压是什么意思| 米醋是什么| mlb中文叫什么| 黄精长什么样| 老古董是什么意思| 股癣用什么药| as是什么病| 男孩小名叫什么好听| 大疱性皮肤病是什么病| 钙盐是什么| 梦见喝酒是什么意思| 原教旨主义是什么意思| 什么叫桑黄| 善存什么时间吃比较好| 解构是什么意思| 什么人不能摆放大象| 梦见吃排骨是什么意思| 妈妈弟弟的儿子叫什么| 慈禧和溥仪是什么关系| 做梦梦见很多蛇是什么意思| 塔罗牌正位和逆位是什么意思| lov是什么意思| 腹泻吃什么药| 狮子座后面是什么星座| 香港什么东西值得买| 生二胎应该注意什么| 不来事是什么原因| amber是什么意思| od值是什么| cs和cf有什么区别| 牙体牙髓科看什么| 处暑吃什么| 单脐动脉对胎儿有什么影响| 点石成金是什么意思| 什么什么三什么成语| 蝼蛄是什么| g6pd是检查什么的| 拉肚子发烧是什么原因| 年轻人血压高是什么原因引起的| 4.22是什么日子| qd是什么意思| 阴道镜活检是什么意思| 市政协主席是什么级别| 肺大泡是什么| 吃红薯有什么好处| 大专什么专业就业前景好| 膀胱炎是什么症状| bv是什么| 大殓是什么意思| 履新是什么意思| 尿里带血是什么原因| 梦见自己掉了两颗牙齿是什么意思| 蒲公英的约定表达什么| 龟吃什么| 造影检查对身体有什么伤害| 百度

新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > VxWorks下PC/104-CAN驱动程序设计

pptv会员账号共享 2017.4.18 PPTVvip帐号分享

作者: 时间:2025-08-04 来源:网络 收藏
摘要:详细介绍实时多任务操作系统环境下程序的设计原理;针对程序实现的困难,给出下实现程序的工作步骤。文件以适配卡为例,简要介绍硬件结构,重点给出驱动程序实现的关键代码。百度 另外一场比较激烈的比赛,发生在武杨与日本选手森樱守之间。

关键词:RTOS PC/104 CAN I/O系统 驱动系统

VxWorks是一款优秀的实时多任务操作系统,具有抢占式调试、中断延迟小等特点。本文在简要介绍必备的硬件环境下,以VxWorks为平台,详细介绍驱动程序的开发。

1 适配卡的硬件结构

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

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()查看)

驱动号码createremoveopenclosereadwriteioctl
1       
2ca OpenNULLca Openca Closeca Readca Writeca Ioctl

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){

处理中断事件

发送(释放)信号量

}

限于篇幅,其它函数略。

图3 I/O系统整体结构

5 CAN驱动调试

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

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

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

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

6 小结

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

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



评论


相关推荐

技术专区

关闭
补充蛋白质吃什么食物 阳虚湿热吃什么中成药 八月份是什么星座 口臭口苦口干吃什么药 什么是辐照食品
金刚是什么树的种子 水床是什么 ccu是什么意思 伤口用什么消毒最好 痛风什么东西不可以吃
乙肝挂什么科 九月是什么星座的 宫内积液什么意思 什么是沙棘 腿发软无力是什么原因引起的
天外飞仙是什么意思 游走是什么意思 guess是什么意思 姜茶什么时候喝最好 智力是什么意思
吃什么补血补气最快hcv8jop9ns5r.cn 脚气用什么药膏效果好hcv8jop3ns7r.cn 2点是什么时辰520myf.com 为什么手机打不出去电话hcv9jop0ns2r.cn 鼻涕有血丝是什么原因hcv7jop5ns5r.cn
偏头痛什么原因hcv8jop3ns3r.cn 情节是什么hcv8jop7ns6r.cn 喝葡萄糖有什么功效与作用hcv8jop9ns4r.cn 六味地黄丸是治什么的hcv9jop7ns2r.cn 硼砂是什么hcv9jop2ns2r.cn
桃对什么hcv9jop6ns7r.cn 小肚子大是什么原因hcv9jop8ns0r.cn 硬水是什么意思hcv9jop5ns8r.cn 早上起来后背疼是什么原因hcv8jop8ns7r.cn 健康管理师是干什么的hcv8jop5ns5r.cn
粉饼是干什么用的hcv8jop0ns7r.cn 为什么光吃不拉大便hcv8jop8ns9r.cn 7月29号是什么日子hcv9jop1ns3r.cn 子宫内膜异位症有什么症状表现hcv7jop6ns3r.cn 雪花飘飘北风萧萧是什么歌hcv9jop7ns9r.cn
百度