文档库 最新最全的文档下载
当前位置:文档库 › 13.56M读卡器开发详解二(RC522驱动程序)

13.56M读卡器开发详解二(RC522驱动程序)

13.56M读卡器开发详解二(RC522驱动程序)
13.56M读卡器开发详解二(RC522驱动程序)

13.56M读卡器开发详解二

1. 硬件接口介绍

根据上一篇的介绍,小编使用了RC522的SPI口通信方式和51单片机进行通信。硬件接口设计此处不再附图。只是将接口配置列写如下:

sbit spi_cs=P1^6;

sbit spi_ck=P1^5;

sbit spi_mosi=P1^4;

sbit spi_miso=P1^3;

sbit spi_rst=P1^2;

#define SET_SPI_CS spi_cs=1

#define CLR_SPI_CS spi_cs=0

#define SET_SPI_CK spi_ck=1

#define CLR_SPI_CK spi_ck=0

#define SET_SPI_MOSI spi_mosi=1

#define CLR_SPI_MOSI spi_mosi=0

#define STU_SPI_MISO spi_miso

#define SET_RC522RST spi_rst=1

#define CLR_RC522RST spi_rst=0

2. 51单片机模拟SPI通信函数

void delay_ns(unsigned int data ns)

{

unsigned int xdata i;

for(i=0;i

{

nop();

nop();

nop();

}

}

unsigned char SPIReadByte(void)

{

unsigned char idata SPICount; // Counter used to clock out the data

unsigned char idata SPIData;

SPIData = 0;

for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read

{

SPIData <<=1; // Rotate the data

CLR_SPI_CK; nop();nop(); // Raise the clock to clock the data out of the MAX7456

if(STU_SPI_MISO)

{

SPIData|=0x01;

}

SET_SPI_CK; nop();nop(); // Drop the clock ready for the next bit } // and loop back

return (SPIData); // Finally return the read data

}

void SPIWriteByte(unsigned char data SPIData)

{

unsigned char idata SPICount; // Counter used to clock out the data for (SPICount = 0; SPICount < 8; SPICount++)

{

if (SPIData & 0x80)

{

SET_SPI_MOSI;

}

else

{

CLR_SPI_MOSI;

} nop();nop();

CLR_SPI_CK;nop();nop();

SET_SPI_CK;nop();nop();

SPIData <<= 1;

}

}

3.RC522芯片的寄存器、命令字等定义

3.1命令字等定义

这些宏定义都是根据RC522数据手册编写的代码。

3.2. RC522寄存器地址定义

4. Rc522的14443协议代码驱动程序 4.1寻卡程序

char PcdRequest(unsigned char data req_code,unsigned char *pTagType)

{ char idata status;

unsigned int idata unLen;

unsigned char xdata ucComMF522Buf[MAXRLEN];

ClearBitMask(Status2Reg,0x08);

WriteRawRC(BitFramingReg,0x07);

SetBitMask(TxControlReg,0x03);

ucComMF522Buf[0] = req_code;

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

if ((status == MI_OK) && (unLen == 0x10))

{

*pTagType = ucComMF522Buf[0];

*(pTagType+1) = ucComMF522Buf[1];

}

else

{ status = MI_ERR; }

return status;

}

4.2防冲撞函数

char PcdAnticoll(unsigned char *pSnr)

{

char xdata status;

unsigned char xdata i,snr_check=0;

unsigned int xdata unLen;

unsigned char xdata ucComMF522Buf[MAXRLEN];

ClearBitMask(Status2Reg,0x08);

WriteRawRC(BitFramingReg,0x00);

ClearBitMask(CollReg,0x80);

ucComMF522Buf[0] = PICC_ANTICOLL1;

ucComMF522Buf[1] = 0x20;

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

if (status == MI_OK)

{

for (i=0; i<4; i++)

{

*(pSnr+i) = ucComMF522Buf[i];

snr_check ^= ucComMF522Buf[i];

}

if (snr_check != ucComMF522Buf[i])

{ status = MI_ERR; }

}

SetBitMask(CollReg,0x80);

return status;

}

4.3选定卡片

char PcdSelect(unsigned char *pSnr)

{

char xdata status;

unsigned char xdata i;

unsigned int xdata unLen;

unsigned char xdata ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_ANTICOLL1;

ucComMF522Buf[1] = 0x70;

ucComMF522Buf[6] = 0;

for (i=0; i<4; i++)

{

ucComMF522Buf[i+2] = *(pSnr+i);

ucComMF522Buf[6] ^= *(pSnr+i);

CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);

ClearBitMask(Status2Reg,0x08);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);

if ((status == MI_OK) && (unLen == 0x18))

{ status = MI_OK; }

else

{ status = MI_ERR; }

return status;

}

4.4验证卡片密码

char PcdAuthState(unsigned char data auth_mode,unsigned char data addr,unsigned char *pKey, unsigned char *pSnr)

{

char xdata status;

unsigned int xdata unLen;

unsigned char xdata i,ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = auth_mode;

ucComMF522Buf[1] = addr;

for (i=0; i<6; i++)

{ ucComMF522Buf[i+2] = *(pKey+i); }

for (i=0; i<6; i++)

{ ucComMF522Buf[i+8] = *(pSnr+i); }

// memcpy(&ucComMF522Buf[2], pKey, 6);

// memcpy(&ucComMF522Buf[8], pSnr, 4);

status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))

{ status = MI_ERR; }

return status;

}

4.5读取M1卡一块数据

char PcdRead(unsigned char data addr,unsigned char *pData)

{

char idata status;

unsigned int idata unLen;

unsigned char idata i,ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_READ;

ucComMF522Buf[1] = addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if ((status == MI_OK) && (unLen == 0x90))

// { memcpy(pData, ucComMF522Buf, 16); }

{

for (i=0; i<16; i++)

{ *(pData+i) = ucComMF522Buf[i]; }

}

else

{ status = MI_ERR; }

return status;

}

4.6写数据到M1卡一块

char PcdWrite(unsigned char data addr,unsigned char *pData)

{

char idata status;

unsigned int idata unLen;

unsigned char idata ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_WRITE;

ucComMF522Buf[1] = addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))

{ status = MI_ERR; }

if (status == MI_OK)

{

memcpy(ucComMF522Buf, pData, 16);

// for (i=0; i<16; i++)

// {

// ucComMF522Buf[i] = *(pData+i);

// }

CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))

{ status = MI_ERR; } }

return status;

}

4.7命令卡进入休眠状态

char PcdHalt(void)

{

char idata status;

unsigned int idata unLen;

unsigned char idata ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_HALT;

ucComMF522Buf[1] = 0;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

return MI_OK;

}

4.8 RC522计算CRC16

void CalulateCRC(unsigned char *pIndata,unsigned char data len,unsigned char *pOutData) {

unsigned char idata i,n;

ClearBitMask(DivIrqReg,0x04);

WriteRawRC(CommandReg,PCD_IDLE);

SetBitMask(FIFOLevelReg,0x80);

for (i=0; i

{ WriteRawRC(FIFODataReg, *(pIndata+i)); }

WriteRawRC(CommandReg, PCD_CALCCRC);

i = 0xFF;

do

{

n = ReadRawRC(DivIrqReg);

i--;

}

while ((i!=0) && !(n&0x04));

pOutData[0] = ReadRawRC(CRCResultRegL);

pOutData[1] = ReadRawRC(CRCResultRegM);

}

4.9 复位RC522

char PcdReset(void)

{

//PORTD|=(1<

SET_RC522RST;

delay_ns(10);

//PORTD&=~(1<

CLR_RC522RST;

delay_ns(10);

//PORTD|=(1<

SET_RC522RST;

delay_ns(10);

WriteRawRC(CommandReg,PCD_RESETPHASE);

delay_ns(10);

WriteRawRC(ModeReg,0x3D); //oíMifare?¨í¨??£?CRC3?ê??μ0x6363

WriteRawRC(TReloadRegL,30);

WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E);

WriteRawRC(TxAutoReg,0x40);//±?D?òa

return MI_OK;

}

4.10 设置RC522工作方式

char M500PcdConfigISOType(unsigned char data type)

{

if (type == 'A') //ISO14443_A

{

ClearBitMask(Status2Reg,0x08);

WriteRawRC(ModeReg,0x3D);//3F

WriteRawRC(RxSelReg,0x86);//84

WriteRawRC(RFCfgReg,0x7F); //4F

WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E);

delay_ns(1000);

PcdAntennaOn();

}

else{ return -1; }

return MI_OK;

}

4.11 读RC522寄存器

unsigned char ReadRawRC(unsigned char data Address)

{

unsigned char xdata ucAddr;

unsigned char xdata ucResult=0;

CLR_SPI_CS;

ucAddr = ((Address<<1)&0x7E)|0x80;

SPIWriteByte(ucAddr);

ucResult=SPIReadByte();

SET_SPI_CS;

return ucResult;

}

4.12 写RC522寄存器

void WriteRawRC(unsigned char data Address, unsigned char data value) {

unsigned char xdata ucAddr;

CLR_SPI_CS;

ucAddr = ((Address<<1)&0x7E);

SPIWriteByte(ucAddr);

SPIWriteByte(value);

SET_SPI_CS;

}

4.13 置和清RC522寄存器位

4.14 RC522与ISO14443卡通讯

char PcdComMF522(unsigned char data Command, unsigned char *pInData,

unsigned char data InLenByte,

unsigned char *pOutData,

unsigned int *pOutLenBit)

{

char data status = MI_ERR;

unsigned char data irqEn = 0x00;

unsigned char data waitFor = 0x00;

unsigned char data lastBits;

unsigned char data n;

unsigned int data i;

switch (Command)

{

case PCD_AUTHENT:

irqEn = 0x12;

waitFor = 0x10;

break;

case PCD_TRANSCEIVE:

irqEn = 0x77;

waitFor = 0x30;

break;

default:

break;

}

WriteRawRC(ComIEnReg,irqEn|0x80);

ClearBitMask(ComIrqReg,0x80);

WriteRawRC(CommandReg,PCD_IDLE);

SetBitMask(FIFOLevelReg,0x80);

for (i=0; i

{ WriteRawRC(FIFODataReg, pInData[i]); }

WriteRawRC(CommandReg, Command);

if (Command == PCD_TRANSCEIVE)

{ SetBitMask(BitFramingReg,0x80); }

//i = 600;//?ù?Yê±?ó?μ?êμ÷??£?2ù×÷M1?¨×?′óμè′yê±??25ms i = 2000;

do

{

n = ReadRawRC(ComIrqReg);

i--;

}

while ((i!=0) && !(n&0x01) && !(n&waitFor));

ClearBitMask(BitFramingReg,0x80);

if (i!=0)

{

if(!(ReadRawRC(ErrorReg)&0x1B))

{

status = MI_OK;

if (n & irqEn & 0x01)

{ status = MI_NOTAGERR; }

if (Command == PCD_TRANSCEIVE)

{

n = ReadRawRC(FIFOLevelReg);

lastBits = ReadRawRC(ControlReg) & 0x07;

if (lastBits)

{ *pOutLenBit = (n-1)*8 + lastBits; }

else

{ *pOutLenBit = n*8; }

if (n == 0)

{ n = 1; }

if (n > MAXRLEN)

{ n = MAXRLEN; }

for (i=0; i

{ pOutData[i] = ReadRawRC(FIFODataReg); }

}

}

else

{ status = MI_ERR; }

}

SetBitMask(ControlReg,0x80); // stop timer now

WriteRawRC(CommandReg,PCD_IDLE);

return status;

}

4.15 天线开启和关闭

4.16 扣款和充值

char PcdValue(unsigned char data dd_mode,unsigned char data addr,unsigned char *pValue) {

char data status;

unsigned int data unLen;

unsigned char idata ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = dd_mode;

ucComMF522Buf[1] = addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))

{ status = MI_ERR; }

if (status == MI_OK)

{

memcpy(ucComMF522Buf, pValue, 4);

// for (i=0; i<16; i++)

// { ucComMF522Buf[i] = *(pValue+i); }

CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

unLen = 0;

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen); if (status != MI_ERR)

{ status = MI_OK; }

}

if (status == MI_OK)

{

ucComMF522Buf[0] = PICC_TRANSFER;

ucComMF522Buf[1] = addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))

{ status = MI_ERR; }

}

return status;

}

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

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

设备驱动程序

驱动程序 驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被比作“硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。 中文名 驱动程序 外文名 Device Driver 全称 设备驱动程序 性质 可使计算机和设备通信的特殊程序 目录 1定义 2作用 3界定 ?正式版 ?认证版 ?第三方 ?修改版 ?测试版 4驱动程序的开发 ?微软平台 ?Unix平台 5安装顺序 6inf文件 1定义 驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 惠普显卡驱动安装 正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设

备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。 设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。 所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。 戴尔电脑驱动盘 驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。 在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。 在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows 自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS 模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附

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

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

驱动程序的接口设计

驱动程序的接口设计 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 实现要点:本函数主要功能是开启设备电源,并确保其初始化状态可靠,因此其中部分操作与系统初始化阶段类似。注意在本操作结束后,采集器仍处于禁

嵌入式系统接口设计与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

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的源码:

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

实时数据库与驱动程序开发接口 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 实时值

【项目管理知识】管理信息系统开发的项目管理

管理信息系统开发的项目管理 实行项目管理,规范其组织模式和管理过程对于保证管理信息系统的开发成功很重要,但更重要的是管理过程中的质量控制及协调工作,这是控制开发成本、提高开发效率和保证开发成果质量的有效手段。 管理信息系统开发的项目管理是为了使开发项目能够按照预定的成本、进度和质量顺利完成,根据管理科学的理论,对需求、成本、人员、进度、质量、风险等进行科学分析和有效管理及控制,并利用工程化开发方法所进行的系统活动。 1项目管理的组织模式 管理信息系统开发可以是企业管理信息系统的开发,也可以是为实现企业某一管理职能而进行的一个单独的开发项目。对于前者,需成立企业的项目委员会,委员会下设项目管理组、项目评审组和项目开发组;如果是后者,则可以根据职能所涉及的范围,召集相关部门人员成立开发项目组,项目组中分设系统开发小组和项目评审小组,由项目负责人进行统一管理和协调。 项目管理负责人可以为多人,由职能部门和信息部门管理人员组成。主要职责为:拟定项目管理的进度安排;组织项目阶段评审;协调整体开发工作;加入收藏对项目管理采取优化措施。 项目评审小组一般由企业技术专家组成。主要职责为:对项目的需求分析进行评审;对系统选型和开发计划进行评审;对系统开发进行阶段性评审;对项目总结报告进行评审。 开发项目组有开发技术人员构成。主要职责是:根据项目负责人的安排具体负责项目的软件开发工作;项目结束后提交开发成果并形成技术文档。

2管理信息系统项目管理过程 一个完整的管理信息系统开发项目通常包括三大阶段:需求分析、系统选型和系统实施。从具体的项目执行过程上来讲,项目管理可分为项目的项目授权、需求分析、项目选型、开发计划制定与实施、项目评估及更新和项目完成验收六个步骤。 2.1项目授权 在管理信息系统的开发要求提出后,需要确定开发项目管理的责任者,由其负责项目的可行性分析、需求评估,并进行项目开发的总体规划和管理与质量控制等,即将项目开发与管理的权限授予某一部门。一般而言,如果是针对企业的某项管理职能而进行的系统开发,应由具备此项管理职能执行能力的部门来负责;若是企业的总体管理信息系统开发,设为首页这应由成立的项目管理委员会负责。 2.2需求分析 需求分析可分为三个过程: 1)可行性评估:根据项目所期望达到的目标,明确项目开发所需要投入的企业资源,并从企业现行的管理方式和理念、人力资源、技术支持等方面考虑,考|试/大确定项目开发成果能否被使用者接受,能否促使工作流程的合理化,提高工作效率,降低企业管理运行成本。 2)需求评估:对管理信息系统开发的整体需求和期望做出分析和评估,详细考虑需求的实现方式,确定系统的各个功能模块及模块间的关系,对系统的信息标准进行统一确定,并据此明确管理信息系统项目成果的期望和目标。

Windows驱动程序开发环境配置

Windows驱动程序开发笔记 一、WDK与DDK环境 最新版的WDK 微软已经不提供下载了这里:https://https://www.wendangku.net/doc/ad11178189.html,/ 可以下并且这里有好多好东东! 不要走进一个误区:下最新版的就好,虽然最新版是Windows Driver Kit (WDK) 7_0_0,支持windows7,vista 2003 xp等但是它的意思是指在windows7操作系统下安装能编写针对windows xp vista的驱动程序, 但是不能在xp 2003环境下安装Windows Driver Kit (WDK) 7_0_0这个高版本,否则你在build的时候会有好多好多的问题. 上文build指:首先安装好WDK/DDK,然后进入"开始"->"所有程序"->"Windows Driver Kits"->"WDK XXXX.XXXX.X" ->"Windows XP"->"x86 Checked Build Environment"在弹出来的命令行窗口中输入"Build",让它自动生成所需要的库 如果你是要给xp下的开发环境还是老老实实的找针对xp的老版DDK吧,并且xp无WDK 版只有DDK版build自己的demo 有个常见问题: 'jvc' 不是内部或外部命令,也不是可运行的程序。 解决办法:去掉build路径中的空格。 二、下载 WDK 开发包的步骤 1、访问Microsoft Connect Web site站点 2、使用微软 Passport 账户登录站点 3、登录进入之后,点击站点目录链接 4、在左侧的类别列表中选择开发人员工具,在右侧打开的类别:开发人员工具目录中找到Windows Driver Kit (WDK) and Windows Driver Framework (WDF)并添加到您的控制面板中 5、添加该项完毕后,选择您的控制面板,就可以看到新添加进来的项了。 6、点击Windows Driver Kit (WDK) and Windows Driver Framework (WDF),看到下面有下载链接,OK,下载开始。下载后的文件名为: 6.1.6001.18002.081017-1400_wdksp-WDK18002SP_EN_DVD.iso将近600M大小。

信息系统开发的格言

信息系统开发的格言 Document number:WTWYT-WYWY-BTGTT-YTTYU-2018GT

信息系统开发的格言 如果信息服务人员和用户人员将下述格言牢记在心,那么,将得到更好的信息系统,而且整个公司的生意将更加兴隆。 □不要无限期地推迟自动化 对于一个面向事务的人工系统的自动化来说,存在着一个转化点,从那一点开始自动化的系统从经济上是可取的。在人工系统中,为了解决增大工作量的问题,必须雇用更多的人,于是使得处理第500个事务的成本如同处理第一个事务一样。尽管对一个自动化的系统的初期费用,用时间和金钱的术语来衡量是相当大的,但是随着工作量增加时,处理每件事务的成本反而降低。 □各个击破 要将系统化分成足够小的、易于管理的模块来进行系统开发。一个高质量信息系统最严重的障碍之一是缺乏有效的通信手段。一旦将系统模块化,则可以将相互交流有效地集中在系统的某一段上。其结果是在用户和信息服务人员之间信息的传递更为有效。 □不要过早的开始写详细功能说明书 在对所有各层还没有吃透之前,项目组不应根据一层的情况而类推下一层并进行全面概括。根据系统的复杂性,需要概括的层次可能有8层之多。项目组应该抵制那种在系统开发初始阶段就忙着进行详细到“位和字节”方面的工作。不幸的是,项目组成员远在第Ⅱ阶段完成之前就开始程序设计是很普遍的。跳过概括的层次将必然要导致不必要的返工。 □在系统设计阶段建立性能检查标准 应该测量系统的质量和性能。在开发之前,应该列出成功的标准,并且应该将针对这些标准评价系统的能力加入到系统设计中。这就使得用户管理人员能够评价系统是否满足目标并且能正确地找出运行的问题。 □在整个系统开发过程中始终强调质量要求的一致性 贯穿整个系统开发的过程中,质量的要求应该是连续的和一致的。能够做到这一点的唯一途径是建立良好的项目管理。从支持其他活动的角度看,一个也不能忽略。最终系统输出的质量并不比质量最低的活动的输出质量要好。例如,如果忽略了(用以在并行工作期间支持严格工作的)系统验收测试活动将打乱工作规则的一致性,从而会降低系统的质量。作为另一个例子,如果决定省略掉技术转移的调查研究而仅仅把注意力集中在内部开发上必将导致在长期的运行中更多的工作和更低的质量。 □采用一种系统开发方法学 提供系统开发指南的系统开发方法学是系统开发必要的工具。之前,我们已经讨论过系统开发方法学的好处。 □边开发边编写资料 资料可以用于建立开发过程,有些项目直到项目实现之前一直忽略了编写资料的工作。采取这种策略的项目组将会发现他们自己不止一次的遇到同样的麻烦。例如,一个用户经理与项目组谈话而没有记录可查。研究表明,如果没有书面资料,在一次会议上的结果在间隔几周之后,能再现的内容之百分比很小。 □尽快停止明显无效益的项目 俗话说:不要因小失大。一旦某个特定项目的输出不能达到用户预期的目的或是不再符合公司的目标,那么就应该把这种项目撤消。很多表现拙劣的系统一直被进行到完成,而这些系统是本应紧急刹车的。

WINDOWS驱动编程

WDM驱动程序开发之读写设备寄存器:KIoRange类 2009-11-09 14:05 WDM驱动程序开发之读写设备寄存器:KIoRange类收藏 KIoRange类: 一、Overview KIoRange类将一系列特殊的外围总线的地址映射到CPU总线的地址空间。CPU总线上的地址即可能在CPU的I/O空间,也可能在CPU的内存空间,这取决于平台和外围总线的控制方式。考虑到可移植性,所有对I/O周期(I/O cycle)进行译码的设备驱动程序必须用这个类对I/O的位置(location)进行正确的访问(access)。KIoRange是KPeripheralAddress类的派生类。 一旦映射关系建立起来,驱动程序就用KIoRange类的成员函数去控制设备的I/O寄存器。这个类提供了8位、16位和32位I/O访问控制的函数。这些函数是以内联(in-line)函数方式来使用的,它们调用系统内相应的宏来产生依赖于平台的代码。 对I/O位置(location)进行访问的另一种备选方案是创建一个KIoRegister 的实例。这要通过取得一个KIoRange对象的数组元素来实现。 为了访问一系列外围总线内存空间的地址,需要用KMemoryRange类。 二、Member Functions 1、KIoRange - Constructor (4 forms) 构造函数 【函数原型】 FORM 1: KIoRange( void ); FORM 2: (NTDDK Only) KIoRange( INTERFACE_TYPE IntfType, ULONG BusNumber , ULONGLONG BaseBusAddress, ULONG Count, BOOLEAN MapToSystemVirtual =TRUE ); FORM 3 (WDM): KIoRange( ULONGLONG CpuPhysicalAddress, BOOLEAN InCpuIoSpace, ULONG Count, BOOLEAN MapToSystemVirtual =TRUE

基于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灯

信息系统开发管理办法(暂行)

华鑫置业(集团)股份XX 信息系统开发管理办法(暂行) 一、目的和作用 本流程详细规定软件开发程的各个阶段及每一阶段的任务、要求、交付文件,使整个软件开发过程阶段清晰、要求明确、任务具体,实现软件开发过程的标准化。 二、适用X围 公司的信息系统开发产品均适用。 三、适用对象 开发管理人员,系统开发人员,系统维护人员 四、软件开发流程 4.1可行性研究与计划 4.1.1实施 a. 软件开发部分析人员进行市场调查与分析,确认软件的市场需求 b. 在调查研究的基础上进行可行性研究,写出可行性报告 c. 评审和审批,决定项目取消或继续 d. 若项目可行,制订初步的软件开发计划,建立项目日志 e. 根据市场环境、公司软硬件情况预测十大风险因素 4.1.2 文档 a. 应交付的文档 1)可行性研究报告 2)初步的软件开发计划 3)十大风险列表 4)软件项目日志

b. 提交步骤 1)适用于以后各阶段的文档提交。 2)项目相关文档用管理工具进行版本管理,相关书写人员可根据各文档模板形式撰写文档,正式提交的文档以存入软件管理服务器相关目录时间为准。以后每次修改都应注明修改内容。 4.2需求分析 4.2.1实施 a. 调查被开发软件的环境 b. 软件开发提出的需求进行分析并给出详细的功能定义 c. 做出简单的用户原型,与用户共同研究,直到用户满意 d. 对可利用的资源(计算机硬件、软件、人力等)进行估计,制定项目进度计划(可有相应的缓冲时间) e. 制定详细的软件开发计划 f. QA部门制订质量控制计划和测试计划 g. 编写初步的用户手册 h. 评审 4.2.2要求 a. 必须以运行环境为基础 b. 应有用户指定人员参加 c. 需求说明书必须明确,并经过用户确认 4.2.3交付文档 a. 软件需求说明书 b. 用户手册(概要) c. 更新后的软件开发计划 d. 项目进度计划 e. QA计划 f. 测试计划* g. 更新后的十大风险列表 h. 软件日志

Windows 内核技术与驱动开发笔记(完整版)

Windows 内核技术与驱动开发笔记 1.简述Driver Entry例程 动程序的某些全局初始化操作只能在第一次被装入时执行一次,而Driver Entry例程就是这个目的。 * Driver Entry是内核模式驱动程序主入口点常用的名字。 * Driver Entry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序。WDM驱动程序的Driver Entry例程应完成对这个对象的初始化并返回。非WDM驱动程序需要做大量额外的工作,它们必须探测自己的硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作。 * Driver Entry的第二个参数是设备服务键的键名。这个串不是长期存在的(函数返回后可能消失)。如果以后想使用该串就必须先把它复制到安全的地方。 * 对于WDM驱动程序的Driver Entry例程,其主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种例程的位置。 2.简述使用VC进行内核程序编译的步骤 编译方式是使用VC++进行编译 1.用VC新建工程。 2.将两个源文件Driver.h和Driver.cpp拷贝到工程目录中,并添加到工程中。 3.增加新的编译版本。 4.修改工程属性,选择“project | setting”将IterMediate file和Output file 都改为MyDriver_Check。 5.选择C/C++选项卡,将原有的Project Options内容全部删除替换成相关参数。 6.选择Link选项卡,将原有的Project Options内容删除替换成相关Link。 7.修改VC的lib目录和include的目录。 8.在VC中选择tools | options,在弹出的对话框中选择“Directories”选项卡,在“Show directories for”下拉菜单中选择“Include file”菜单。添加DDK的相关路径。 3.简述单机内核调试技术 答:1.下载和安装WinDbg能够调试windows内核模块的调试工具不多,其中一个选择是微软提供的WinDbg 下载WinDbg后直接双击安装包执行安装。 2.安装好虚拟机以后必须把这个虚拟机上的windows设置为调试执行。在被调试系统2000、2003或是xp的情况下打开虚拟机中的windows系统盘。 3.将boot.ini文件最后一行复制一下,并加上新的参数使之以调试的方法启动。重启系统,在启动时就可以看到菜单,可以进入正常windows xp,也可以进入Debug模式的windows xp。 4.设置VMware管道虚拟串口。调试机与被调试机用串口相连,但是有被调试机是虚拟机的情况下,就不可能用真正的串口连接了,但是可以在虚拟机上生成一个用管道虚拟机的串口,从而可以继续内核调试。 4.请画出Windows架构简图

(完整版)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

常用信息系统的开发方法

⑴结构化生命周期方法 信息系统从规划开始,经过分析、设计、实施直到投入使用,并在使用过程中随其运行环境的变化而不断修改,当它不再适应需要的时候就要被淘汰,而由新的消息系统代替老的信息系统,这种周期循环称为信息系统的生命周期。结构化方法将信息系统软件生命分为系统规划、系统分析、系统设计、系统实施和系统维护五个阶段。各阶段工作按顺序开展,行如自上而下的瀑布,所以又称瀑布模型方法,在生命周期的每一个阶段都有明确的工程任务并要求产生一定规格的文档资料。只有前一阶段工作完成并通过评审才能开始下一阶段的工作。如果评审过程中发现错误,则要返回前面某个阶段,重复有关工作,直到该阶段通过审评。这样做可以及时发现错误,防止将错误蔓延到后续阶段,避免重大损失。 在结构化生命周期法开发信息系统的过程中,特别强调结构化的分析和设计原则,事实上,结构化系统分析与系统设计是一种简单、实用、应用广泛的方法,其基本思想是: ①采用自顶向下、逐层分解、逐步求精的方法分析整个系统,可以有效的减少和控制系统开发的复杂性。 ②采用图示工具描述分析和设计内容,便于系统开发过程中各种人员之间相互交流。 ③明确系统开发的各个阶段的任务。例如,在系统分析的阶段明确系统所需要的结构和功能,而在系统设计阶段明确系统的

结构和功能如何实现 ④强调用户进行系统分析及系统设计过程中的作用。 ⑵原型法 原型法是随着计算机软件的发展,特别是在关系数据库系统、第四代程序设计语言和各种工具产生的基础上,提出的一种新的系统开发的方法。所谓原型,是指由系统分析人员和用户合作,在短期内定义用户基本需求的基础上,首先开发出一个具有基本功能、实用性的,简易的应用软件。然后运行这个原型,并在相应的辅助开发工具的支持下,按照不断求优的设计思想,通过反复的完善性实验而最终开发出符合用户需求的整个信息系统。目前,在信息系统开发中还使用面向对象方法和case方法。

第五章 管理信息系统的开发方法

第五章管理信息系统的开发方法 通过本章学习,了解管理信息系统开发的任务和特点;懂得系统开发的原则、系统开发的方式、开发的策略、开发的组织工作与项目管理的内容;掌握结构化系统开发生命周期法和原型法的基本思想、开发过程和各自的优缺点;理解面向对象法和计算机辅助开发方法。 基本内容 一、管理信息系统开发 1.系统开发的任务:系统开发的任务是根据企业管理的战略目标、规模、性质等具体情况,从系统论的观点出发,运用系统工程的方法,按照系统发展的规律,为企业建立起计算机化的信息系统。其中核心是设计出一套适合于现代企业管理要求的应用软件系统。 2.系统开发的特点:复杂性、基于原系统、高于原系统、一把手工程、产品是无形的。 3.系统开发的基本原则:面向用户原则、系统性原则、符合软件工程规范的原则、逐步规范发展的原则。 4.系统开发的主要风险:投入超计划、系统性能比预期差、没获得预期收益,有的甚至导致完全失败。 二、系统开发方法 1.结构化系统开发方法 结构化系统开发方法:用系统工程的思想和工程化的方法,遵照用户至上的原则,从系统的角度分析问题和解决问题,将提出建立一个管理信息系统到系统完全建成的生命周期划分为5个阶段,这5个阶段是:系统规划、系统分析、系统设计、系统实施和系统维护与评价。按照规定的步骤和任务要求,使用图表工具完成规定的文档,采用自顶向下整体分析和设计,自底向上逐步实施的系统开发过程。 优点:建立面向用户的观点、严格区分工作区间、设计方法结构化、文件标准化和文献化。 缺点:开发周期长、繁琐,使用工具落后、不能充分预料可能发生的情况及变化、不直观,用户最后才能看到真实模型。 2.原型法 原型法:是指系统开发人员在初步了解用户的基础上,借助功能强大的辅助系统开发工具,快速开发一个原型,并将其演示给用户,开发人员根据用户的意见和评价对这个原型进行修改,如此反复,逐步完善,直到用户完全满意为止。 原型法的类型:丢弃式原型法、演化式原型法、递增式原型法。 优点:减少开发时间,提高系统开发效率、改进用户与系统开发人员的信息交流方式、用户满意程度高、应变能力强。 缺点:开发工具要求高、对大型系统或复杂性高的系统不适用、管理水平要求高。 3.面向对象法 面向对象法:面向对象方法的技术把对象的属性(数据)和处理(方法)封装在一起,通过子类对父类的继承,使得软件便于维护和扩充,提高了软件的可复用性。 面向对象法的术语:对象、类、消息、继承、封装。 优点:以对象为基础,利用特定的软件工具直接完成对象客体的描述与软件结构之间的转换,解决了传统结构化开发方法中客观世界描述工具与软件结构不一致的问题,缩短了开发周期,解决了从分析和设计到软件模块多次转换的繁杂过程。 缺点:需要有一定的软件基础支持才可以应用,对大型的系统可能会造成系统结构不合

相关文档
相关文档 最新文档