当前位置:文档之家› 最简单的HelloWorld驱动实验碰到的问题和经验分享

最简单的HelloWorld驱动实验碰到的问题和经验分享

最简单的HelloWorld驱动实验碰到的问题和经验分享
最简单的HelloWorld驱动实验碰到的问题和经验分享

最简单的HelloWorld驱动实验碰到的问题和经验分享

参考tekkaman的linux设备驱动程序学习:https://www.doczj.com/doc/c114761669.html,/u1/34474/showart.php? id=407202

小弟新手,初次接触设备驱动学习,写的不对的还请指正呀~~

今天实验了第一个设备驱动Hello,world!模块,期间碰到了几个问题,在此分享下经验,希望以后的朋友碰到了类似问题能少走弯路.

实验环境:

主机:Ubuntu10.04,emacs,minicom等.

板子:mini2440(128M的nandflash)

交叉编译:arm-linux-gcc-4.3.2(友善提供的)

内核:linux-2.6.32.2

hello.c文件的代码如下:

复制代码

1.#include

2.#include

3.MODULE_LICENSE("Dual BSD/GPL");

4.

5.static int hello_init(void)

6.{

7. printk(KERN_ALERT "Hello,yuzexi001!\n");

8. return 0;

9.}

10.

11.static void hello_exit(void)

12.{

13. printk(KERN_ALERT "Goodbye,yuzexi001~\n");

14.}

15.

16.module_init(hello_init);

17.module_exit(hello_exit);

将hello.c保存在自己的工作目录下.并编写一个Makefile文件(自己还不会,基本参考了tekk aman的),内容如下:

复制代码

1.KERNELDIR = /home/yuzexi/Working/mini2440/linux-

2.6.32.2

2.PWD := $(shell pwd)

3.INSTALLDIR = /home/yuzexi/Working/rootfs/lib/modules

4.

5.CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-

https://www.doczj.com/doc/c114761669.html, = $(CROSS_COMPILE)gcc

7.

8.obj-m := hello.o

9.

10.modules:

11. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

12.

13.modules_install:

14. cp hello.ko $(INSTALLDIR)

15.

16.clean:

17. rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

18.

19..PHONY:modules modules_install clean

/*几点说明:

**1,在编译该模块之前,请确保你的内核源码树已经搭建好,也就是给驱动开发的环境是否搭建好了.这个可以参考我们arm9之家论坛里的资料--文件名是"Mini2440 Linux移植开发实战指南.pdf"具体的链接下载地址自己也忘了.

**2,Makefile中的KERNELDIR就是内核源码树的位置,根据自己的实际情况来定.

**3,网上有个搭建设备驱动程序开发环境的帖子:https://www.doczj.com/doc/c114761669.html,/s/blog_66e7d9b70 100i26v.html,可以试试看.

*/

最后,在工作目录下执行

#make modules

#make modules_install

执行的结果如下所示:

root@Ubuntu10-04:/home/yuzexi/Working/myproject/drivers/HelloWorld# make modules make -C /home/yuzexi/Working/mini2440/linux-2.6.32.2 M=/home/yuzexi/Working/mypr oject/drivers/HelloWorld modules

make[1]: 正在进入目录`/home/yuzexi/Working/mini2440/linux-2.6.32.2'

CC [M] /home/yuzexi/Working/myproject/drivers/HelloWorld/hello.o

Building modules, stage 2.

MODPOST 1 modules

CC /home/yuzexi/Working/myproject/drivers/HelloWorld/hello.mod.o

LD [M] /home/yuzexi/Working/myproject/drivers/HelloWorld/hello.ko

make[1]:正在离开目录`/home/yuzexi/Working/mini2440/linux-2.6.32.2'

root@Ubuntu10-04:/home/yuzexi/Working/myproject/drivers/HelloWorld# make modules _install

cp hello.ko /home/yuzexi/Working/rootfs/lib/modules

root@Ubuntu10-04:/home/yuzexi/Working/myproject/drivers/HelloWorld# ls

hello.c hello.mod.c hello.o modules.order

hello.ko hello.mod.o Makefile Module.symvers

root@Ubuntu10-04:/home/yuzexi/Working/myproject/drivers/HelloWorld#

到此,就生成了hello.ko文件,可以通过FTP或者网络或者U盘将hello.ko文件拷贝到开发板(mini2440)中,注意:这里需要拷贝到开发板的/lib/modules/2.6.32.2-FriendlyARM目录下面(参考mini2440用户手册7.3.3,第374页).

好了,现在假设你已经登录了开发板,并且hello.ko文件已经拷贝到了/lib/modules/2.6.32. 2-FriendlyARM/目录下面.下面是执行过程:

#cd /lib/modules/2.6.32.2-FriendlyARM

[root@FriendlyARM 2.6.32.2-FriendlyARM]# ls

hello.ko

[root@FriendlyARM 2.6.32.2-FriendlyARM]# insmod hello.ko

Hello,yuzexi001!

[root@FriendlyARM 2.6.32.2-FriendlyARM]# lsmod

hello656 0 - Live 0xbf000000

[root@FriendlyARM 2.6.32.2-FriendlyARM]# rmmod hello

rmmod: chdir(2.6.32.2): No such file or directory

到这里,问题就出现了,rmmod: chdir(2.6.32.2): No such file or directory

注意这里的问题提示目录为:chdir(2.6.32.2),根据置顶帖"驱动的加载与卸载中常见问题:rm mod chdir no such file or directory 的最终解决办法"11楼wbweb的提示,于是我大胆的将开发板的/lib/modules/2.6.32.2-FriendlyARM/目录修改为/lib/modules/2.6.32.2/ 后,重新测试后,成功.

测试如下:

[root@FriendlyARM 2.6.32.2]# pwd

/lib/modules/2.6.32.2

[root@FriendlyARM 2.6.32.2]# ls

hello.ko

[root@FriendlyARM 2.6.32.2]# insmod hello.ko

Hello,yuzexi001!

[root@FriendlyARM 2.6.32.2]# lsmod

hello656 0 - Live 0xbf006000

[root@FriendlyARM 2.6.32.2]# rmmod hello

Goodbye,yuzexi001~

[root@FriendlyARM 2.6.32.2]# lsmod

[root@FriendlyARM 2.6.32.2]#

OK,到此为止,第一个HelloWorld驱动模块测试结束~ 希望更多学驱动的朋友越来越顺利~~ 置顶帖子的地址:https://www.doczj.com/doc/c114761669.html,/read.php?tid-3328.html

附一:

Mini2440 Linux移植开发实战指南.pdf链接地址找到了,如下:

https://www.doczj.com/doc/c114761669.html,/download/mini2440-linux-guide.zip

或者:https://www.doczj.com/doc/c114761669.html,/read.php?tid-5682.html

完全参考这个pdf文档,中途会遇到几个小问题,其解决方法可以参考这里:http://www.arm9h https://www.doczj.com/doc/c114761669.html,/read.php?tid-5964.html

这里写下自己遇到的问题:

1,理解Mini2440 Linux移植开发实战指南战指南.pdf文档中的这样一句:"将smdk_machine _init()函数调用注释代掉,因为后面会编写自己的初始化函数,不需要调用smdk2440原来的. " 这里在后面本应该添加的初始化文档中却没有添加,这里我参考了官方已经移植好的内核来修改的,将s3c_device_nand.dev.platform_data=&mini2440_nand_info添加到/arch/arm/ mach-s3c2440/mach-mini2440.c的__init mini2440_machine_init(void)函数中

2,另外,还需要添加这些头文件:

#include

#include

#include

#include

#include

#include

按照上面的pdf文档修改,并按照上面的两条修改后,才能从启动信息中查看到你想要的分区表!!!

3,在移植UDA1341音频驱动时,#make menuconfig

Device Drivers-><*>Sound card suppport->[*]preclaim Oss device numbers-><*>Adva nced Linux Sound Architecture-><*>ALSL for SoC audio support-><*>Soc I2S Audio support UDA134x wired to a S3C24xx

这里的配置直接参考上面的pdf文档即可,不需要将其他的音频驱动也编译到内核,否则在测试时失败! !!

默认的内核配置中,这里已经包含了sequencer support 和Dynamic device file

minior numbers和support old ALSA API, 将这三项去掉后,重新编译内核,音频驱动测试成功!

配置菜单的时候并不是越多越好,不知道这句话对不对?呵呵

附二:解决卸载模块后的小bug:rmmod: module 'hellop' not found

今天上午修改了hello.c,模块参数的修改这一点.测试如下,但是当卸载hellop后,最后有个小小的问题.

[root@FriendlyARM 2.6.32.2]# insmod hellop.ko howmany=10 whom="beyond"

(0):Hello,beyond!

(1):Hello,beyond!

(2):Hello,beyond!

(3):Hello,beyond!

(4):Hello,beyond!

(5):Hello,beyond!

(6):Hello,beyond!

(7):Hello,beyond!

(8):Hello,beyond!

(9):Hello,beyond!

[root@FriendlyARM 2.6.32.2]# lsmod

hellop 792 0 - Live 0xbf006000

[root@FriendlyARM 2.6.32.2]# rmmod hellop

Goodbye,Ubuntu10.04~ I love you so much!

rmmod: module 'hellop' not found

[root@FriendlyARM 2.6.32.2]# lsmod

[root@FriendlyARM 2.6.32.2]#

为什么会提示rmmod: module 'hellop' not found呢,请参考帖子:https://www.doczj.com/doc/c114761669.html,/ u1/38994/showart_2034575.html

看完这个帖子后,可能找到了原因,但是不大理解,还请高人帮忙解释下,为什么当/lib/module

s/2.6.32.2/目录下有多个*.ko文件时,会有这个小bug呢,该怎样理解呢,谢谢~

情况是这样的,在/lib/modules/2.6.32.2/目录下面,有多个*.ko文件,这里是hello.ko和hellop. ko,于是我将hello.ko和另外一个modules.dep.bb删除后,只剩下hellop.ko文件,接着重新测试后,不再提示"rmmod: module 'hellop' not found"

今天在进行字符设备scull驱动实验的时候,也同样出现了这个问题,其实这里只需要将/lib/m odules/2.6.32.2/目录下面的modules.dep.bb删除即可搞定!!!

实验如下:

[root@FriendlyARM 2.6.32.2]# ls

hello.ko hellop.ko modules.dep.bb

[root@FriendlyARM 2.6.32.2]# rm modules.dep.bb

[root@FriendlyARM 2.6.32.2]# ls

hello.ko hellop.ko

[root@FriendlyARM 2.6.32.2]# rm hello.ko

[root@FriendlyARM 2.6.32.2]# ls

hellop.ko

[root@FriendlyARM 2.6.32.2]# lsmod

[root@FriendlyARM 2.6.32.2]# insmod hellop.ko howmany=6 whom="yuzexi"

(0):Hello,yuzexi!

(1):Hello,yuzexi!

(2):Hello,yuzexi!

(3):Hello,yuzexi!

(4):Hello,yuzexi!

(5):Hello,yuzexi!

[root@FriendlyARM 2.6.32.2]# lsmod

hellop 792 0 - Live 0xbf00c000

[root@FriendlyARM 2.6.32.2]# rmmod hellop

Goodbye,Ubuntu10.04~ I love you so much!

[root@FriendlyARM 2.6.32.2]# lsmod

[root@FriendlyARM 2.6.32.2]#

修改后的hellop.c代码如下:

复制代码

1.#include

2.#include

3.#include

4.

5.static char *whom = "Ubuntu10.04";

6.static int howmany = 2;

7.module_param(howmany,int,S_IRUGO);

8.module_param(whom,charp,S_IRUGO);

9.

10.static int hello_init(void)

11.{

12. int i;

13. for(i=0;i

14. printk(KERN_ALERT "(%d):Hello,%s!\n",i,whom);

15. return 0;

16.}

17.

18.static void hello_exit(void)

19.{

20. printk(KERN_ALERT "Goodbye,Ubuntu10.04~ I love you so much!\n");

21.}

22.

23.module_init(hello_init);

24.module_exit(hello_exit);

25.MODULE_LICENSE("Dual BSD/GPL");

对应的Makefile中将hello.o修改为hellop.o;将hello.ko修改为hellop.ko即可

用java写出hello world

用java写出hello world 程序员圈子当中最出名的一句话就是hello world了。 这句话被写在各大编程教材当中,不论是什么语言,让初学者的第一个程序往往都是输出一句hello world。 为什么是hello world,不是hello别的呢?大约是对于程序员来说,从这一行代码开始,开启了一扇新的大门吧。 废话不多说,那就让我们也随大流,从hello world开始吧。 Java和C++一个巨大的区别在于java是纯面向对象语言,几乎所有的东西都会被视为一个“对象”。对象这个词在中文里看起来有些奇怪,英文叫做object,其实就是物体,或者你当做东西也行。 为什么要这么做呢? 这里其实隐含了一个抽象的过程,在传统的C语言当中,主体是过程。也就是说,一段代码写的是一段计算过程。整个程序由不同的过程组合而成。 而在java当中,写的是对象。所有的计算封装在了对象内部。举个经典的例子,假如我要实现一个转账的功能。C语言的做法是操作A账户的余额,减去转账金额,再操作B账户余额,增加金额。在java当中,账户就是一个对象,对象内的数据是不允许外界访问的。所以需要调用对应的方法,让A和B账户自己改动余额。 这个其实就是面向对象的思想,不能理解也没有关系,后续我们会在面向对象相关的内容当中再详细解释的。 之所以介绍对象的概念,是因为在java程序当中,所有的java文件都是类文件。类英文叫class,指的是对象的抽象概念。 我这么解释你肯定不明白,我举个例子你就懂了。

比如在游戏里,有许多种怪物。比如怪物有两个属性,一个是血量一个是攻击力。你在游戏当中看到的一个个怪物,是一个个程序创造出来的对象。而对怪物的这种定义,叫做类。 也就是说类是我们对某个东西的定义,而对象是根据这个定义创建出来的虚拟的物体。就比如说,类是印钞机,我们在类上定义钞票的图案、面额、文字等等,而印出来的钞票,是对象。 声明一下,这些概念大概理解就行,不用死记。记住,学编程是不用死记的,死记说明了不理解,理解了自然就记住了。

监控软件设备驱动程序的编程与实现

监控软件设备驱动程序的编程与实现 0 前言 在专业监控软件出现以前,自动控制系统集成人员的一个重要任务就是编写专门的系统上位监控程序。但是,在实际工程中我们发现:一方面,由于各编程人员的水平参差不齐,许多软件的功能和可靠性都存在问题;另一方面,由于每个编程人员的编程习惯和编程思路都不同,程序的可读性和功能的扩展性都比较差。因此,功能强大、实用面广的专业监控软件就应运而生。如MCGS监控软件、组态王控软件等。由于现场智能仪表、采集板的多种多样,监控软件自带的设备驱动程序毕竟有限,因此编制设备驱动程序就成了自控系统集成工程师的重要工作之一。 本文以北京昆仑通态公司开发的MCGS为例来说明监控软件设备驱动程序的一般思路。MCGS是基于Windows95和WindowsNT平台,为用户提供了从数据采集到数据处理、报警处理、流程控制、动画显示、报表输出等解决实际工程问题的完整方案和操作工具。MCGS允许用户在VisualBasic中操作MCGS中的对象,提供了一套开放的可扩充接口,用户可根据自己的需要用VB编制特定的功能构件来扩充系统的功能。 1接口原理 许多组态软件提供了设备驱动程序软件开发包,支持用户用VB、VC、Delphi等高级编程语言编制设备驱动程序。MCGS组态软件驱动程序编程原理框图如图1所示: 几乎所有的PLC、智能仪表、采集板卡都提供了驱动软件,有的在说明书中还提供了驱动软件的核心代码、函数或数据结构。而监控软件也提供了开放性的可扩充接口,一般包括属性函数、方法函数、IO端口操作函数和串口操作函数等。在运行模式下,监控软件定时或在事件激发时调用设备驱动程序,而设备驱动程序根据需要,再调用设备核心函数。例如,MCGS在组态模式下按在线帮助按钮就会调用GetDevHelp接口,显示设备构件的在线帮助;按内部属性按钮时就会调用SetDevPage接口,显示设备构件的特定属性页。在运行环境下,MCGS首先调用一次InitDevRun接口对设备进行一些必须的初始化工作。

UEFI-HelloWorld

用vs2008创建一个HelloWorld的UEFI程序第一步,创建工程(MakeFile Project) 第二步,创建以下文件

(1)编译命令 32位程序: 打开文件buildx86.bat,写上@call "C:\MyWorkSpace\edksetup.bat" @call "C:\MyWorkSpace\edksetup.bat" Build -t VS2008x86 -a IA32 -p MyFirstEfi\MyFirstEfi.dsc -m MyFirstEfi\MyFirstEfi\MyFirstEfi.inf -b DEBUG 64位程序: 打开文件buildx64.bat,写上 @call "C:\MyWorkSpace\edksetup.bat" Build -t VS2008x86 -a X64 -p MyFirstEfi\MyFirstEfi.dsc -m MyFirstEfi\MyFirstEfi\MyFirstEfi.inf -b RELEASE 配置: 1.打开工程属性

下图中Working Directory为SecMain.exe所在文件夹 我自己的默认为:C:\MyWorkSpace\Build\NT32IA32\DEBUG_VS2008x86\IA32

(2)配置.inf 打开MyFirstEfi.inf文件写上 [Defines] INF_VERSION = 0x000010005 BASE_NAME = MyFirstEfi FILE_GUID = B044C901-36CB-46a6-B286-5C432ADF99AB #需要自己生成GUID MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 1.0 ENTRY_POINT = UefiMain [Sources] MyFirstEfi.c [Packages] MdePkg/MdePkg.dec [LibraryClasses] UefiBootServicesTableLib UefiApplicationEntryPoint UefiLib DebugLib

触摸屏接口硬件编写驱动程序

尽管触摸屏正在迅速普及开来,但大多数开发人员以前从来没有开发过触摸屏产品。本文详细介绍了触摸屏产品的设计步骤,指导读者了解使触摸屏首次工作需要的软硬件细节。 触摸屏如今随处可见。工业控制系统、消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。我们平时不经意间都会用到触摸屏。在ATM机上取款、签署包裹,办理登机手续或查找电话号码时都可能会用到触摸屏。 本文介绍了二种较新的CPU,它们都内建了对触摸屏输入的支持。本文将介绍如何编写软件驱动程序,从而能够使用这些微处理器配置、校准触摸屏以及对触摸屏输入持续响应。最终将提供可免费下载和使用的工作代码,作为读者进一步设计的基础。 触摸屏作为输入手段的优点和缺点 没有一种输入方式是十全十美的,对某些特定的应用和产品类型来说,触摸屏不是最好的输入手段。为了让读者清楚的了解触摸屏的特性,下面先概括使用触摸屏作为输入手段的优点和缺点。 首先是优点:触摸屏不可否认的具有酷的感觉,立刻就能使产品的使用变得更有乐趣。同时触摸屏也非常直观。当用户想要选择A选项时,他伸出手指碰一下A 选项就可以了。这还不够直观吗?连两岁的婴儿都知道怎样伸手去触摸他(或她)想要的东西。 最后要说的是,触摸屏作为输入装置和系统固定在了一起。如果用户忘记遥控器或鼠标放的位置,就会无法进行输入。而如果具有触摸屏的设备放在用户前面,用户马上就可以用触摸屏进行输入。 再说缺点,触摸屏可能会在不合适的场合下被错误的使用。这里我是指对安全性要求严格的设备,对于这些设备,如果没有适当的预防措施,使用触摸屏会非常危险。下面我将概括一些最明显的潜在的问题,如果读者想作更进一步的了解,可以参考更多的资料。 第一个问题是视差,即屏幕上看到的对象的位置与其在触摸面板上的实际有效位置之间的差异。图1说明了这个问题。我能想到的最佳例子是典型的“免下 车”ATM机。这种ATM机不会根据汽车的高度升高或降低自己的高度,因此如果你坐在较高的SUV或卡车里,那么你就会从抬高的位置俯视显示屏。为了保护昂贵的显示器件免受恶意破坏,ATM机都会在用户和显示屏之间放置几层强化玻璃。 触摸屏是不能这样保护的。如果真这样做的话,用户就无法进行触摸了。因此触摸屏放在表层上,而显示屏放在表层下的几层玻璃后面。这就造成了触摸层和显示层之间的物理隔离。如果用户以某个角度观看屏幕,就意味着用户按压触摸屏进行选择的位置会与用户接口软件预期的输入位置之间存在一定的距离偏差。

Hibernate3.6(开发必看)

1.Java对象持久化概述 1.1.应用程序的分层体系结构 1.1.1.基于B/S的典型三层架构 说明: 1,展现层:提供与用户交互的界面。 2,业务逻辑层:实现各种业务逻辑。 3,数据访问层:负责存放和管理应用程序的持久化业务数据。 1.1. 2.数据访问层与Hibernate在Java应用程序中的 角色 数据访问层(持久化层)封装了数据访问的细节,为业务逻辑层提供了面向对象的API。完善的持久化层应该达到的目标: 1,代码重用性高,可完成所有的数据访问操作。 2,如果需要的话,能够支持多种数据库平台。 3,具有相对独立性,当持久化层变化时,不会影响上层实现。 在数据访问层(持久化层)中可以使用Hibernate框架以实现要求,如下图所示:

1.2.软件模型 1.2.1.各种模型的说明 概念模型: 模拟问题域中的真实实体。描述每个实体的概念和属性及实体间关系。不描述实体行为。实体间的关系有一对一、一对多和多对多。。 关系数据模型: 在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。有以下内容组成:1,若干表 2,表的所有索引 3,视图 4,触发器 5,表与表之间的参照完整性

域模型: 在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。 组成部分: 1,具有状态和行为的域对象。 2,域对象之间的关联。 域对象(domain object): 构成域模型的基本元素就是域对象。对真实世界的实体的软件抽象,也叫做业务对象(Business Object,BO)。域对象可代表业务领域中的人、地点、事物或概念。 域对象分为以下几种: 1,实体域对象:通常是指业务领域中的名词。(plain old java object,简单Java 对象)。 2,过程域对象:应用中的业务逻辑或流程。依赖于实体域对象,业务领域中的动词。如发出订单、登陆等。 3,事件域对象:应用中的一些事件(警告、异常)。 1.2.2.域对象间的关系 关联: 类间的引用关系。以属性定义的方式表现。

从C语言实战谈编程:hello world(入门)

从C语言实战谈编程:hello world(入门) 一、学前要思考 从今天开始,我会按照我的想法一步一步地谈论如何编程。可能我的想法和你不太一样,和其他人不太一样,这不奇怪,每个人都有每个人做法和想法嘛。我从不是照书宣讲,但也不随便乱讲,我还是有系统的、有针对性的、把自己对编程的看法呈现给你们与你们交流。不要拒绝新的尝试、试试听听别人想法,说不定会有一些收获。 我想问一下读者,当你要学一门新的语言的时候,你应该首先考虑什么?你应该怎么学?你怎么才算学好了?.你会考虑这些问题吗?如果你从不考虑这些问题,不知道怎么去考虑,那我第一课就要告诉你,要学会思考。一个程序员不善于思考就不会是一个好的程序员,记住要学会思考,不习惯也要习惯。 如何思考?思考什么?学一门语言首先要把学习一门语言当做一个整体来思考。在学之前就要考虑好,为啥要学?怎么学?学什么?学多长时间?学到什么程度? 很多过来的程序员在学习语言的时候,由于没有很好考虑这些问题,急于编程序、急于看到程序运行出来的结果,或者一切顺其自然,没有急迫感,边学边做,若干年后也不知道自己到底学的怎么样。这些是我最不愿意看到的。 1、为啥要学? 我认为这个问题一定要从实用主义出发,一定要学了有用。比如,工作需要、找工作需要、做自己项目的需要。总之能够在近期带来经济效益的,可以考虑去学。那些因好奇、因升级、因流行、因新品、因技术而去学则不要浪费时间去学,最多去了解就行了。而如果为了兴趣,这个就要考虑了,可以考虑比较一两个有用的程序语言去学习。人的时间本来不多,而程序员的时间更是不多而且珍贵,所以要珍惜使用。 2、怎么学? 我看到大部分人都是找本书,先看,再试,不懂网上去查,是向书学习,向网学习的个人学习。这种方法一定学出来的是一个平均水平的程序员。我提倡的是不要看书(这个方法我在《程序员成长路线图:从入门到优秀》一书中专门说过),找人学。通过向别人学习,可以加快学习的进程、找到学习的重点、避免无谓的自己长时间查出错原因,更重要的是培养程序员团队意识,通过与其他人的交流,取长补短,共同进步。有些同学会说:"我找不会编程的人呀,向谁去学呀?"我只能说,现在会编程的人很多,只要你用心找,一定会找到的。至于人家肯不肯教你,那就要看你的了。

驱动程序的接口设计

驱动程序的接口设计 WinCE下的驱动皆以动态链接库的形式存在。驱动实现中可以调用所有的标准API。WinCE的两种驱动模型——本机驱动模型和流接口驱动模型——其中本机驱动模型用于低级、内置设备,实现一组特定的接口函数;而流接口驱动模型是基本的驱动类型,提供一组通用设备接口,适用于多种设备。本设计采用的ADC驱动为数据采集驱动,是整个数据采集系统的核心。首先介绍几个流接口驱动的接口函数: (1)ADC_Init: 函数原型:DWORD ADC_Init(LPCTSTR Identifier) 功能描述:软件资源初始化,硬件地址空间映射,硬件初始化,中断注册。 参数描述:Identifier为字符串指针,指向本驱动在注册表标识符路径键值。 实现要点:本函数的关键部分在于对硬件地址空间的映射,通Virtualalloc,Viirtualcopy将I/O寄存器、中断寄存器、PWM寄存器和存储器地址空间映射到系统内存空中去;此外还要对硬件进行系统启动后的第一次初始化,包括中断硬件初始化和注册、fifo的清零和采集的禁止等。注意为保证系统的稳定和低功耗,在本函数运行后,数据采集器处于禁止中断和电源关闭状态。 具体使用:ADC_Init会把设备内容指针传递给ADC_Open。 (2)ADC_Deinit: 函数原型:BOOL ADC_Deinit(PADC_Info pContext) 功能描述:软件资源释放,硬件反初始化,中断屏蔽。 参数描述:pContext是驱动软件结构体指针。 实现要点:本函数为ADC_Init的逆向操作。 具体使用:释放了ADC_Init中分配的资源。 (3)ADC_Open: 函数原型:DWORD ADC_Open(DWORD pContext,DWORD AccessCode,DWORD ShareMode) 功能描述:打开设备,AD上电,禁止中断,禁止触发,清除FIFO,数据缓冲区初始化。 参数描述:pContext是驱动软件结构体指针;AccessCode为读写访问权限。 制模式码:ShareMode为共享访问权限控制模式码。 应用接口:CreateFile 实现要点:本函数主要功能是开启设备电源,并确保其初始化状态可靠,因此其中部分操作与系统初始化阶段类似。注意在本操作结束后,采集器仍处于禁

QtCreator安装和helloworld程序编写

封面 作者:PanHon glia ng 仅供个人学习

一、Qt Creator的安装和hello world 程序的编写

我们这里讲述windows 下的Qt Creator ,在Linux 下基本相同。本文先讲述基本的下载、安装和最简单程序的编写,然后在附录里又讲解了两种其他的编写程序的方法。 1.首先到Qt 的官方网站上下载Qt Creator ,这里我们下载windows 版的。下载地址:如下图我们下载:Download Qt SDK for Windows* (178Mb) 下载完成后,直接安装即可,安装过程中按默认设置即可。 2.运行Qt Creator ,首先弹出的是欢迎界面,这里可以打开其自带的各种演示程序。 3.我们用File->New 菜单来新建工程。 4.这里我们选择Qt4 Gui Application 。 5.下面输入工程名和要保存到的文件夹路径。我们这里的工程名为hello world 。 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以直接点击Next 。 7.我们将base class 选为QDialog 对话框类。然后点击Next 。 8.点击Finish ,完成工程的建立。 9.我们可以看见工程中的所有文件都出现在列表中了。我们可以直接按下下面的绿色的run 按钮或者按下Ctrl+R 快捷键运行程序。 10.程序运行会出现空白的对话框,如下图。 11.我们双击文件列表的dialog.ui 文件,便出现了下面所示的图形界面编辑界面。 12.我们在右边的器件栏里找到Label 标签器件

13.按着鼠标左键将其拖到设计窗口上,如下图 14.我们双击它,并将其内容改为hello world 。 15.我们在右下角的属性栏里将字体大小由9 改为15 16.我们拖动标签一角的蓝点,将全部文字显示出来 17.再次按下运行按钮,便会出现hello world 。 到这里hello world 程序便完成了。 Qt Creator 编译的程序,在其工程文件夹下会有一个debug 文件夹,其中有程序的.exe可执行文件。但Qt Creator默认是用动态链接的,就是可执行程序在运行时需要相应的.dll 文件。我们点击生成的.exe 文件,首先可能显示“ 没有找到mingwm10.dll ,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。”表示缺少mingwm10.dll 文件。 解决这个问题我们可以将相应的.dll 文件放到系统中。在Qt Creator 的安装目录的qt 文件下的bin 文件夹下(我安装在了D 盘,所以路径是 D:\Qt\2009.04\qt\bin ),可以找到所有的相关.dll 文件。 方法一:在这里找到mingwm10.dll文件,将其复制到C:\WINDOWS\systen文件夹下即可。下面再提示缺少什么dll 文件,都像这样解决就可以了。 方法二:将这些dll 文件都与.exe 文件放到同一个文件夹下。不过这样每 个.exe文件都要放一次。 方法三:将D:\Qt\2009.04\qt\bin加入系统Path环境变量。右击我的电脑->属性->高级->环 境变量->在系统变量列表中找到Path,将路径加入其中即可。 附 1:用纯源码编写。 1.新建空的Qt4 工程。 2.工程名为hello world ,并选择工程保存路径(提示:路径中不能有中 文)。 3.在新建好的工程中添加文件。右击工程文件夹,弹出的菜单中选择 Add New。

嵌入式系统接口设计与Linux驱动程序开发

嵌入式系统接口设计和Linux驱动程序开发 书名:嵌入式系统接口设计和Linux驱动程序开发 作者:刘淼 出版社:北京航天航空大学出版社 ISBN:9787810778619 定价:39.00 元 出版日 2006-5-1 期: 编辑推荐 Linux是源码开放的操作系统,它发展迅速,爱好者众多,同时也是主流的嵌入式操作系统之一。以ARM 为核心的处理器使用广泛,成本低廉,软件支持好,也是当今市场占有率最高的32位嵌入式处理器。本书Linux和ARM处理器平台为例,结合两大主流软件和硬件,讲述嵌入系统开发的相关知识,是对深入学习嵌入式系统很有借鉴意义的书。 内容简介 本书针对ARM处理器为核心的主流嵌入式系统平台,主要讲述嵌入式Linux驱动程序的设计和开发过程。内容同时涵盖嵌入式系统的软硬件两个方面:一方面是嵌入式系统常用的硬件接口时序、电气特性等内容的分析;另一方面讲述对应硬件的Linux驱动程序实现方法。本书共分为16章。第1、2章介绍嵌入式系统和Linux驱动程序的基础性知识。从第3章开始,详细讲述硬件平台及其对应的Linux驱动程序。硬件包括I/O口、CAN总线、触摸屏、I2CPS/2、异步串口、音频、显示、IDE、PCMCIA、USB、以太网以及Flash 的使用等内容。软件涉及针对上述硬件的各种驱动程序在Linux下的体系结构,Linux的字符设备、块设备和网络设备驱动程序,ARM Linux的中断处理,BootLoader和内核的启动过程等。 本书可作为机器人技术、机电控制系统、信息家电、工业控制、手持设备、智能玩具、医疗仪器等方面嵌入式系统开发和使用的参考书,也可作为高等院校有关嵌入式系统教学的本科生或研究生的教材。 作者简介 刘焱,吉林省吉林市人。2000年开始从事嵌入式系统方面的研发工作,参加过多项国家863、自然基金研究项目,熟练掌握ARM等RISC微处理器系统的硬件设计及LinuxWinCEVxWorks等操作系统的软件设计.尤其擅长硬件接口和驱动程序等系统底层架构设计。先后主持过基于S3C4480、S3C2410、PXA270等多款嵌入式教学实验平台及基于HMS30C7202.AT91 RM9200的工业测控系统的开发工作,作为主要研究人员完成的嵌入式数控系统已在企业成功使用。曾担任过清华大学软件学院、北京航空航天大学软件学院嵌入式系统课程的实验教学工作及南开大学软件学院的嵌入式系统专业课程教学工作。现任中国电子学会嵌入式系统培训中心ESTC认证讲师。 目录 第1章典型的嵌入式系统体系结构 1.1嵌入式系统概述1 1.2嵌入式系统的组成1 1.2.1嵌入式平台的硬件架构2 1.2.2板级支持包和嵌入式系统2 1.2.3嵌入式系统上的使用程序3 1.3嵌入式系统的开发流程和优势3 1.4嵌入式系统的方案选择5

Makefile下编写Helloworld的例子

什么是makefile?或许很多Windows的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得 要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专 业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile, 从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复 杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make 命令,整个工程完全自动编译,极大的提高了软件 开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如: Delphi的make,VisualC++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 更新版本 hello.c程序 #include int main(){printf("Hello,World!\n");

return 0;}=== makefile开始=== Helloworld: hello.o gcc hello.o–o Helloworld Hello.o: hello.c hello.h gcc–MM hello.c gcc–c hello.c–o hello.o .PHONY: clean Clean: rm–rf*.o hellworld === makefile结束===

实时数据库与驱动程序开发接口-解析

实时数据库与驱动程序开发接口 V1.0 2006/12/29发布 1引言 根据整个组态的结构描述,在驱动程序与实时数据库之间交换的内容包括采集的实时数据及由实时数据库向驱动发送的控制命令串,驱动程序要求实时数据库或其他驱动支持的功能。 2实现方式 具体的实现方式是能过共享内存的方式进行数据传送。系统驱动所使用的共享内存全部编号使用,编号从0开始顺序递增,不同的驱动使用不同的共享内存编号,一般一个驱动使用一个共享内存,特殊情况下一个驱动可以使用一个以上的共享内存号。系统提供若干函数对共享内存的创建及使用进行支持。并且提供完整的温巡驱动程序,使用纯C语言编写。二次开发人员可以阅读,参照完成其他驱动的编写工作。另外对每一个驱动的开发需要在drive目录下建立一个单独的文件存储驱动的应用程序与设置文件.以omron为例,需在drive下建立omron 目录.对每一个驱动程序写一个readme.txt文件和一个config.txt文件来描述开发的目的及驱动的用法及驱动程序的参数设置. 系统占用的共享享内存编号有如下几个, 其他程序请不要占用. 100 声音驱动使用 102 短信程序使用 103 电话语音报警使用 80web驱动使用 3驱动程序编写说明

3.1 数据区 驱动程序采集的量一般分为两种形式一种是实时数据量如遥信,遥测与遥脉等. 另一种类型是结构量,如SOE, 保护动作记录等。 实时数据量采用0 - 1999进行编号, 驱动程序开发人员可自行安排其中的某一段为遥信,遥测或遥脉, 例如0 - 100 为遥信, 101-200 为遥脉, 201 - 300 为遥测.对于遥信多的,将更多的编号分配给遥信,对于遥测多的将更多的编号分配给遥测。采集上来的量在组态的参数配置中按驱动编写的情况进行配置. 3.2 上传结构变量 结构型变量采用如下方法进行传送,系统提供若干个结构串位置,当将指定形式的若干个结构串放入结构串中时,同时将串个数告诉实时数据库。则实时数据库程序读入所有的串,并根据指定的格式进行存盘操作或命令操作。结构串的格式一般为一个特征码附加若干有效字串参数。 3.3 命令区 驱动程序从实时数据库中接收的内容一般是命令串,命令串中包括命令特征码及命令附带的数据,当收到退出命令时驱动程序应自动安全地退出. 退出命令是命令字符串"EXIT"。 3.4 下行结构变量 下传结构变量一般是由实时数据库传送到驱动程序的下行结构变量。接收下行结构变量的程序一般有声音报警,电话报警,及调度程序等。 4类接口说明 4.1 支持函数文件列表 1)ramdrive.h 2)ramdrive.c 4.2 使用步骤 1)使用方法bool CreateRam( int ramid ); 完成共享内存的建立,参数为数据共享区的编号. 2)设置实时数据 void SetValue( int id, int iValue ) id 编号iValue 实时值

java的简单代码HelloWorld

今天第一次学习了java的编程,是自己自学的哦,我很是高兴哦,现在把我学到的东西给大家分享一下,供初学者学习体会. 首先我是下载了一个JDK,但是那个eclipse不会用, 于是就用JDK+记事本, 编写了一个经典的程序,Hello World, 最后成功了,我很高兴的了,虽然对于那些高手来说是很简单的知识了,但是成大事先从小事做起嘛。我相信我以后一定会成功的,我的技术会更加强大的。每一个人都要这样想哦,加油,那么现在就让我来给你开启这个java的有趣的世界吧,人家说java一点都不难学,我们要坚定这一个观点哦,人家可是大师呢。那么现在开始吧, 第一步,在设置好环境变量之后, 在桌面新建一个HelloWorld.java的文件然后输入代码, 具体的代码如下 public class HelloWorld { public static void main(String[]agrs){ System.out.println(“这是我第一个java小程序,我一定会努力的,java很简单,我一定会学会的,加油!!!”): } } 具体的解释如下; 第一行为java的类public 公共的class类HelloWorld 类的名称 第三行说明java的方法static静止的String 字符串 下一行打印输出 然后将此扩展名为.java的文件保存到D盘中。 然后启动运行,输入CMD进入命令提示符, 首先输入D: 然后再输入dir/w 此时你就会看到D盘中的文件里有一个HelloWorld.java的文件, 运行javac编译器编译成字节码。 输入javac HelloWorld.java回车 如果没有错误的话就会显示D盘 再次输入dir你会看见D盘中增加了一个文件,是HelloWorld.class 最后在java虚拟机中运行已经在编译器中编译好的.class文件, 输入java HelloWorld 回车,这是你就会在虚拟机界面中看到你要答应出来的东西。 具体的结果如图。

Windows驱动开发入门

接触windows驱动开发有一个月了,感觉Windows驱动编程并不像传说中的那么神秘。为了更好地为以后的学习打下基础,记录下来这些学习心得,也为像跟我一样致力于驱动开发却苦于没有门路的菜鸟朋友们抛个砖,引个玉。 我的开发环境:Windows xp 主机+ VMW ARE虚拟机(windows 2003 server系统)。编译环境:WinDDK6001.18002。代码编辑工具:SourceInsight。IDE:VS2005/VC6.0。调试工具:WinDBG,DbgView.exe, SRVINSTW.EXE 上面所有工具均来自互联网。 对于初学者,DbgView.exe和SRVINSTW.EXE是非常简单有用的两个工具,一定要装上。前者用于查看日志信息,后者用于加载驱动。 下面从最简单的helloworld说起吧。Follow me。 驱动程序的入口函数叫做DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pRegisgryString)。两个参数,一个是驱动对象,代表该驱动程序;另一个跟注册表相关,是驱动程序在注册表中的服务名,暂时不用管它。DriverEntry 类似于C语言中的main函数。它跟main的差别就是,main完全按照顺序调用的方法执行,所有东西都按照程序员预先设定的顺序依次发生;而DriverEntry则有它自己的规则,程序员只需要填写各个子例程,至于何时调用,谁先调,由操作系统决定。我想这主要是因为驱动偏底层,而底层与硬件打交道,硬件很多都是通过中断来与操作系统通信,中断的话就比较随机了。但到了上层应用程序,我们是看不到中断的影子的。说到中断,驱动程序中可以人为添加软中断,__asm int 3或者Int_3();前者是32位操作系统用的,后者是64位用的。64位驱动不允许内嵌汇编。下面是我的一个helloworld的源码:

基于ARM的通用IO接口驱动程序设计

西安文理学院机械电子工程系 课程设计任务书 学生姓名张聪聪专业班级 09级自动化(1)班学号08013090122 指导教师雷俊红职称讲师教研室自动化 课程自动化专业课程设计 题目 基于ARM的通用I/O接口驱动程序设计 任务与要求 利用ARM实验箱上的资源设计一个LED灯驱动。 设计要求: 1)搭建交叉编译环境 2)通过NFS网络文件系统建立共享目录 3)LED按照1S的时间间隔亮灭,实现闪烁的效果 开始日期 2011.12.05 完成日期 2011.12.14 2011年 12 月 5 日

基于ARM的通用I/O接口驱动程序设计 摘要: 目前,基于ARM技术的嵌入式系统几乎已经深入应用到各个领域,是当今32位嵌入式系统应用的主流。ARM在工业控制领域的应用也受到越来越多的关注。随着嵌入式在生活中的应用越来越广泛,可广泛应用于移动设备、网络设备、工控设备、仪器仪表等。Linux 系统本身就是一个优秀的操作系统,再加上他的源代码是开放的,所以就把它作为嵌入式开发的核心原型系统。 嵌入式Linux设备驱动是嵌入式系统中十分重要的部分,我们选择了LED灯的驱动程序开发作为课程设计题目。可以进一步熟悉Linux操作系统及Linux的编程,同时也了解Linux下驱动开发的大体流程。 本次课程设计的LED灯的驱动程序开发大致包括两个部分,他们是交叉编译环境的搭建和驱动程序、应用程序的编写。交叉编译工具使用arm-linux-gcc-4.3.3,使用NFS网络文件系统构成共享目录完成程序的烧写。主要功能就是在已挂载LED驱动程序的情况下,用应用程序让LED间隔1S亮灭以验证驱动程序是否正常。 关键词:ARM;Linux操作系统;驱动程序开发;交叉编译;NFS;LED灯

(完整版)AT89C51单片机USB接口驱动和应用程序的开发毕业论文

北方民族大学 学士学位论文论文题目:AT89C51单片机USB接口驱动和应用程序的开发 院(部)名称:电信学院 学生姓名:杨闯 指导教师姓名:周春艳 论文提交时间: 2010年5月24日 论文答辩时间:2010年5月29日 学位授予时间:

北方民族大学教务摘要 通用串行总线USB是一种新兴的并逐渐取代其他接口标准的数据通信标准。USB,由于速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文以基于USB总线的数据采集系统的研制过程为主要内容,阐述了利用CH372与ATMEL的AT89C51等组成的一套数据采集系统的设计方案、开发方法和开发过程,并给出了具体实现方案。 论文首先简要介绍了USB总线的相关内容,然后介绍了数据采集系统的设计。数据采集系统的设计包括硬件设计、固件程序开发、驱动程序开发和应用程序开发四部分。在硬件设计部分,首先介绍了设计中所用的CH372的性能和特点,然后给出了具体硬件设计方案,并对设计中应该注意的问题进行了说明。驱动和应用程序主要完成USB设备的读写和即插即用功能,并提供一个友好的人机界面,对数据采集系统进行控制并显示采集后的数据。 本论文已完成了基于USB总线的数据采集系统的设计,用其实现了基本的数据采集功能。使用USB总线传输数据,为数据采集系统与计算机之间的通讯开辟了新的道路。 关键词:USB、驱动程序、应用程序、AT89C51、CH372

Abstract Universal serial bus USB is one kind of emerging and replace other interface standards of data communication standards. USB, due to fast, convenient and flexible easy to expand, to support plug and play, low cost advantages, such as widely application. The paper is mainly concerned with design process of data acquisition system that is based on USB bus. The design scheme, developing method and developing process of a suit of data acquisition system used with CH372 and ATMEL’s AT89C51 are expatiate. In addition, the paper also gives the material realization scheme. At fist, the paper introduces the protocol of USB bus in brief, and then discusses the design of data acquisition system, which includes four parts, , firmware design, device driver and application program. In the in detail; the questions which should be paid attention to in design is explained. Drivers and applications of the main equipment and USB plug and play function, and provide a friendly -machine interface, control of

CANoe入门三部曲

基础应用 CANoe是Vector公司的针对汽车电子行业的总线分析工具,现在我用CANoe7.6版本进行介绍,其他版本功能基本差不多。 硬件我使用的是CANcaseXL. 1,CANoe软件的安装很简单,先装驱动,再装软件。安装完成,插上USB,连接硬件,这样在控制面板中,VectorHardware进行查看 通过查看信息可知,CANcaseXL中的两个piggy,一个是251(高速CAN),一个是7269(LIN),另外常用的还有1054(低速CAN,或称容错CAN),因为CANcaseXL中只能支持两路通讯,这样piggy可以自由组合 2,硬件连接正常,打开CANoe软件 File->NewConfiguration可以选择新建工程的模版,我们这里选择CAN_500kBaud.tcn,这样新建了波特率为500KCAN工程,可以File->SaveConfiguration,进行保存 3,接下来就要使用CANdb++Editor工具对总线网络节点,消息,信号,进行定义了。 点击工具栏的这个图标,或开始菜单中找这个工具启动 启动后,File->CreateDatabase,选择CANTemplate.dbc,选择目录及文件名,进行保存 右键Networknodes->New,进行网络节点的定义,这里只需要填写Name即可,例如:Node_A 然后添加Node_B,完成后如下图,这样在Networknodes目录下面添加出来两个节点 节点添加完成后,下一步添加CAN消息,右键Messages->New,这是需要定义名称,ID,DLC 等信息,如下: 然后在Transmitters页面,点击Add按钮,添加Node_A为发送节点,意思就是说,此消息是从Node_A节点发送出来的 其实还有一种方法就是,此时暂时不定义发送节点,然后直接以拖曳的方式拖曳到发送节点上,功能上是一样的 有了消息,消息里携带的东西自然是信号咯,那么我们开始创建一个信号 右键Signals->New,填写如下信息 信号当然要放到消息中咯,切换到Messages页面,Add我们刚刚建立的Message_A,当然和上面一样,采用拖曳的方式从Signal到Message中建立关联也是可以的。 上面信息中Intel模式和Motorola格式的区别如下: 用0和1来表示开关信号状态似乎还不是很直观,我们可以使用on和off来表示就好了,于是View->ValueTables,右键空白处->New,键入如下信息:

实验一Android开发环境搭建与Helloworld

实验一 Android开发环境搭建与Hello world 一、实验目的 学会搭建并安装Android开发环境,并实现Hello World应用开发。 二、主要仪器设备及套数 计算机 三、实验容 搭建开发环境;安装Java JDK,下载Eclipse,解压Eclipse;官方下安装ADT (Android Development Tools);安装Android;安装手机USB驱动;建立新项目,实现Hello World 四、程序代码 package .example.helloandroid; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/c114761669.html,yout.activity_main); } Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will

驱动程序与应用程序的接口

驱动程序与应用程序的接口 本文翻译自DriverWorks帮助文件 杨全胜 有两种方式可以让设备和应用程序之间联系: 1.通过为设备创建的一个符号链; 2.通过输出到一个接口 WDM驱动程序建议使用输出到一个接口而不推荐使用创建符号链的方法。这个接口保证PDO的安全,也保证安全地创建一个惟一的、独立于语言的访问设备的方法。 一个应用程序使用Win32APIs来调用设备。在某个Win32 APIs和设备对象的分发函数之间存在一个映射关系。 获得对设备对象访问的第一步就是打开一个设备对象的句柄。 用符号链打开一个设备的句柄 为了打开一个设备,应用程序需要使用CreateFile。如果该设备有一个符号链出口,应用程序可以用下面这个例子的形式打开句柄: hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL ); 文件路径名的前缀“\\.\”告诉系统本调用希望打开一个设备。这个设备必须有一个符号链,以便应用程序能够打开它。有关细节查看有关Kdevice和CreateLink的内容。在上述调用中第一个参数中前缀后的部分就是这个符号链的名字。 注意:CreatFile中的第一个参数不是Windows 98/2000中驱动程序(.sys文件)的路径。是到设备对象的符号链。 如果使用DriverWizard产生驱动程序,它通常使用类KunitizedName来构成设备的符号链。这意味着符号链名有一个附加的数字,通常是0。例如:如果链接名称的主干是L “TestDevice”那么在CreateFile中的串就该是“\\\\.\\TestDevice0”。 如果应用程序需要被覆盖的I/O,第六个参数(Flags)必须或上FILE_FLAG_OVERLAPPED。 使用一个输出接口打开句柄 用这种方式打开一个句柄会稍微麻烦一些。DriverWorks库提供两个助手类来使获得对该接口的访问容易一些,这两个类是CDeviceInterface, 和CdeviceInterfaceClass。 CdeviceInterfaceClass类封装了一个设备信息集,该信息集包含了特殊类中的所有设备接口信息。 应用程序能有用CdeviceInterfaceClass类的一个实例来获得一个或更多的CdeviceInterface类的实例。CdeviceInterface类是一个单一设备接口的抽象。它的成员函数DevicePath()返回一个路径名的指针,该指针可以在CreateFile中使用来打开设备。 下面用一个小例子来显示这些类最基本的使用方法: extern GUID TestGuid; HANDLE OpenByInterface( GUID* pClassGuid,

相关主题
文本预览
相关文档 最新文档