第一章1.答:接口,是指计算机和其他设备之间的物理和逻辑系统的连接结构。
它用于解决计算机和相关设备的硬件连接及信息联通的问题。
2.答:计算机传送控制信息、状态信息和数据信息。
传送的方式有无条件传送方式、有条件传送方式、中断传送方式、DMA传送方。
3.答:计算机的硬接口有专门的集成式电路组成,可分为系统内部部件接口芯片、串并行数据传送接口芯片和外部设备接口芯片。
它们用于CPU和各种部件或外部设备进行数据交换。
7.答:串口进行通信的方式有两种:同步通信方式和异步通信方式。
同步通信方式要求通信双方以相同的时钟频率进行,而且准确协调,通过共享一个单个时钟或定时脉冲源保证发送方和接收方的准确同步,效率较高;异步通信方式不要求双方同步,收发方可采用各自的时钟源,双方遵循异步的通信协议,以字符为数据传输单位,发送方传送字符的时间间隔不确定,发送效率比同步传送效率低。
查阅资料:8254的引脚功能8254芯片由数据总线缓冲器、读/写控制逻辑、控制字寄存器和3个计数器通道组成。
3个计数器通道和控制字寄存器通过内部总线相连,内部总线再经缓冲器与CPU数据总线相接。
控制字寄存器是8位只写寄存器,用于存放由CPU写入芯片的方式选择控制字或命令字,由它来控制8254中各计数器通道的工作方式。
3个计数器通道相互间是完全独立的,但结构和功能完全相同。
每个通道的内部结构大体如图8.1所示,只是其中的控制字寄存器并非每个通道各有一个,而是3个通道共用一个。
当写入控制字时,将同时清除计数初值寄存器的内容。
计数工作单元(CE)和计数初值寄存器(CR)、输出锁存器(OL)均为16位,而内部总线的宽度为8位,因此CR的写入和OL的读出都必须分两次进行。
若在初始化时只写入CR的一个字节,则另一个字节的内容保持为0。
CE是CPU不能直接读/写的,需要修改其初值时,只能通过写入CR实现;需要读CE的当前内容时,必须先写入读回命令,将CE的内容锁存于OL,然后再读出OL内容。
经锁存后的OL内容将一直保持至CPU读出时为止。
在CPU读出OL之后,OL又跟随CE变化。
状态寄存器保持有当前控制字寄存器的内容、输出状态以及CR内容是否已装入CE的指示状态,同样必须先锁存到状态锁存器,才允许CPU读取。
(8253中没有状态寄存器和状态锁存器,这是8254和8253的主要区别之一)。
OUT、CLK和GA TE的作用已在前面说明过,它们是每个通道和外界联系的引脚信号。
当某通道用作计数器时,应将要求计数的次数预置到该通道的CR中,被计数的事件应以脉冲方式从CLKi端输入,每输入一个计数脉冲,计数器内容减1,待减至0时,OUTi端将有信号输出,表示计数次数到。
当某通道用作定时器时,由CLKi端输入一定周期的时钟脉冲,同时根据定时的时间长短确定所需的计数值,并预置到CR中,每输入一个时钟脉冲,计数器内容减1,待计数值减到0时,OUTi端将有输出,表示定时时间到。
可见,任一通道无论作计数器用或作定时器用,其内部操作完全相同,区别仅在于前者是由计数脉冲(间隔不一定相同)进行减1计数,而后者是由周期一定的时钟脉冲作减1计数。
作计数器用时,要求计数的次数可直接作为计数初值预置到减1计数器;8259引脚图引脚功能8259是一种中断控制芯片,在单片机系统中一般用来扩展单片机的中断,pc机中也有这个芯片,《8259引脚图》8259A的主要功能如下:①一片8259A可以接受并管理8级可屏蔽中断请求,通过9片8259A级联可扩展至64级可屏蔽中断优先控制。
②对每一级中断都可以通过程序来屏蔽或允许。
③在中断响应周期,8259A可为CPU提供相应的中断类型码。
④具有多种工作方式,并可通过编程来加以选择。
初始化命令字的作用是什么?如何对8259A进行初始化编程?答案:通过初始化编程向8259A写入相应的初始化命令ICW,可以使芯片处于一个规定的基本工作方式,并在此方式下进行工作。
8259A的初始化命令字共有4个ICW1-ICW4,进行初始化时要求ICW1-ICW4按一定的顺序写入。
举例:VxD程序.386pinclude vmm.incDECLARE_VIRTUAL_DEVICE ;这是一个DDB结构(参数共22个),这个宏用于简化 FIRSTVXD,\ ;最好用你的VXD的文件名1,\ ;主版本号0,\ ;副版本号FIRSTVXD_Control,\ ;入口模块地址UNDEFINED_DEVICE_ID,\ ;设备IDUNDEFINED_INIT_ORDER ;初使化顺序Begin_control_dispatch FIRSTVXD ;看看和FIRSTVXD_Control有什么关系?哈哈! ;入口,下次说.End_control_dispatch FIRSTVXDEND/************************makefile.mak*************************/NAME=firstvxd$(NAME).vxd:$(NAME).objlink -vxd -def:$(NAME).def $(NAME).obj$(NAME).obj:$(NAME).asmml -coff -c -Cx -DMASM6 -DBLD_COFF -DIS_32 $(NAME).asm/************************firstVxd.def*************************/VXD FIRSTVXD DYNAMICSEGMENTS_LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE_LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE_LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE_TEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE_DATA CLASS 'LCODE' PRELOAD NONDISCARDABLECONST CLASS 'LCODE' PRELOAD NONDISCARDABLE_TLS CLASS 'LCODE' PRELOAD NONDISCARDABLE_BSS CLASS 'LCODE' PRELOAD NONDISCARDABLE_LMGTABLE CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL_LMSGDATA CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL_IMSGTABLE CLASS 'MCODE' PRELOAD DISCARDABLE IOPL_IMSGDATA CLASS 'MCODE' PRELOAD DISCARDABLE IOPL_ITEXT CLASS 'ICODE' DISCARDABLE_IDATA CLASS 'ICODE' DISCARDABLE_PTEXT CLASS 'PCODE' NONDISCARDABLE_PMSGTABLE CLASS 'MCODE' NONDISCARDABLE IOPL_PMSGDATA CLASS 'MCODE' NONDISCARDABLE IOPL_PDATA CLASS 'PDATA' NONDISCARDABLE SHARED_STEXT CLASS 'SCODE' RESIDENT_SDATA CLASS 'SCODE' RESIDENT_DBOSTART CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING _DBOCODE CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING _DBODATA CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING _16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE_RCODE CLASS 'RCODE'EXPORTSFIRSTVXD_DDB @1/***********************************make.bat*****************************/ nmake/f makefile/************************************************************************/举例:WDM程序/***************************************************************函数名称:DriverEntry()功能描述:WDM程序入口***************************************************************///extern "C"是必须的,表示“用C链接”。
如果你的文件名是HelloWDM.c的话,这句可以省略。
extern "C"NTSTA TUS DriverEntry( IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){//指定“添加设备”消息由函数“HelloWDMAddDevice()”来处理:DriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;//指定“即插即用”消息由函数“HelloWDMPnp()”来处理:DriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;//返回一个NTSTA TUS值STA TUS_SUCCESS。
几乎所有的驱动程序例程都必须返回一个NTSTA TUS值,这些值在NTSTA TUS.H DDK头文件中有详细的定义。
return STA TUS_SUCCESS;}/***************************************************************函数名称:HelloWDMAddDevice()功能描述:处理“添加设备”消息***************************************************************/NTSTA TUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject){//定义一个NTSTA TUS类型的返回值:NTSTA TUS status;//定义一个功能设备对象(Functional Device Object):PDEVICE_OBJECT fdo;//创建我们的功能设备对象,并储存到fdo中:status = IoCreateDevice(DriverObject, //驱动程序对象sizeof(DEVICE_EXTENSION), //要求的设备扩展的大小NULL, //设备名称,这里为NULLFILE_DEVICE_UNKNOWN, //设备的类型,在标准头文件WDM.H或NTDDK.H中列出的FILE_DEVICE_xxx值之一0, //各种常量用OR组合在一起,指示可删除介质、只读等。