嵌入式硬件体系的调试图文.docx
《嵌入式硬件体系的调试图文.docx》由会员分享,可在线阅读,更多相关《嵌入式硬件体系的调试图文.docx(7页珍藏版)》请在冰豆网上搜索。
嵌入式硬件体系的调试图文
《嵌入式系统硬件设计》教程
第十一讲嵌入式硬件体系的调试
编著与讲演:
怯肇乾
一.知识准备与上述相关讲义的回顾
知识准备:
电路测试、系统的模拟与仿真等;
相关讲义的回顾:
CPU器件的模拟与仿真、测量控制电路、系统基础电路。
二.常用电路测试工具及其使用
直流电源
示波器:
模拟示波器、数字示波器
多功能数字万用表
逻辑分析仪
三.常用调试手段与技巧介绍
1.用双路直流电源得到正负电源供给
-+-+
负源
地
正源
2.PCB板的板级测试
板上各种电源的短路测试;
首次加电测试,各种主要电源测试、主要IC的运行发热状况观察等;CPU之时钟电路测试、复位电路测试;
3.模拟信号源的实验板制作
主要是对信号发生器所产生信号的调理,包括缩放、零点调整等;
ADJST321
4
11
DB4ALM324RB528kRB512k
RB541k
RB535kCB2104
CB1104
-12V
+12V+12VCB31047
CB5104CB6104
4.逐一电路模块的测试:
飞线、割线等手段的使用
CPU之各种外扩存储器测试;
CPU之主要外设测试;
系统接口电路、通讯电路测试;
5.模拟干扰、振动实验等可靠性测试
使用可调的模拟干扰仪器、振动器,或自制的相应工具,得到相应的恶劣环境,置所设计系统于其中,进行测试、调整、完善。
四.PC机测试程序及其书写
DOS
Debug测试,VB、VC或C++Builder可视化应用测试程序书写等。
例:
1.DOSDebug的并口测试:
在DOS或WindowsDOS窗口下,可通过Debug软件的I(读或O(写命令对三个寄存器的状态进行观察改写,如:
C:
\>Debug
-O3785A
-I378
5A
-I379
78
-O37a55
-I37a
55
2.使用嵌入式汇编语言书写可视化测试程序
下面是用C++Builder书写的ISA收发卡的初始化和收发函数charTForm1:
:
initial(void//ISA卡的初始化函数
{asm{movdx,211h//0xff-->Port(211h
moval,0ffh
outdx,al
movbx,2fffh
}
loop1:
asm{decbx
jzend
movdx,211h//Port(211h.3=1?
inal,dx
testal,008h
jzloop1
}
asm{movdx,211h//0x00-->Port(211h
moval,000h
outdx,al
movbx,2fffh
}
loop2:
asm{decbx
jzend
movdx,211h//Port(211h.3=0?
inal,dx
testal,008h
jnzloop2
}
return0;
end:
return-1;
}
charTForm1:
:
ByteReceive(void//字节接收函数{charz;
asmmovbx,0fffh
loop:
asm{decbx
jznnn
movdx,211h
inal,dx
testal,002h
jnzloop
}
asm{movdx,210h
inal,dx
movz,al
}
gotoeee;
nnn:
z=0x20;
eee:
return(z;
}
voidTForm1:
:
ByteSend(charz//字节发送函数{loop:
asm{movdx,211h//Port(211h.0=1?
inal,dx
testal,001h
jzloop
}
asm{movdx,210h//Port(210h
moval,z
outdx,al
}
}
3.用WinAPI函数进行串行异步通信
HANDLEhCom;
DCBdcb;
BOOLfSuccess,bResult;unsignedlongnBytesWritten,nBytesRead;COMMTIMEOUTStimeouts;
//-----------------------------------------------------------------------
void__fastcallTForm1:
:
initial(void
{//opentheserialporttoreadorwrite
hCom=CreateFile(port,GENERIC_READ|GENERIC_WRITE,0,
NULL,OPEN_EXISTING,0,NULL;
if(hCom==INVALID_HANDLE_VALUE
{ShowMessage("notOpenSerialPortSelected!
";}
//setthesizesofin&outbuffer,inbytes
fSuccess=SetupComm(hCom,2000,2000;
if(!
fSuccessShowMessage("SetupCommunicationFail!
";//settimeoutsparameterstoreadserialport
timeouts.ReadIntervalTimeout=MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier=MAXDWORD;
timeouts.ReadTotalTimeoutConstant=1000;//65000;
fSuccess=SetCommTimeouts(hCom,&timeouts;
if(!
fSuccess
ShowMessage("SetCommunicationTimeoutsFail!
";
setserialcommunicationparameters
fSuccess=GetCommState(hCom,&dcb;
if(!
fSuccessShowMessage("GetCommunicationFail!
";dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
fSuccess=SetCommState(hCom,&dcb;
if(!
fSuccessShowMessage("SetCommunicationfail!
";
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
readport(void
{//readtheserialport
bResult=ReadFile(hCom,&inBuffer,1952,&nBytesRead,NULL;
if(!
bResult
{switch(GetLastError(
{caseERROR_INVALID_USER_BUFFER:
ShowMessage("ErrorInvalidUserBuffer!
";
break;
default:
ShowMessage(GetLastError(+"ReadDataFail!
";
break;
}
}//dealwithdatumreceivedanddisplay…}bResult=WriteFile(hCom,end,2,&nBytesWritten,NULL;if(!
bResultexit(0;}//closeserialport}break;default:
ShowMessage(GetLastError(+"WriteIDFail!
";break;*//*{switch(GetLastError({caseERROR_INVALID_USER_BUFFER:
ShowMessage("ErrorInvalidUserOutBuffer!
";}CloseHandle(hCom;五.底层设备驱动程序及其书写Win2000DDK、VToolsD、WinDriver等对常规硬件接口驱动程序的书写。
1.用Win2000DDK开发驱动程序驱动程序包括即插即用和电源管理功能,对内核模式驱动程序、内核流驱动程序、图形驱动程序、虚拟设备驱动程序等有特殊的写法要求。
开发步骤:
⑴编写驱动程序代码,应包括条件编译标记的调试检查。
⑵测试和调试,检查构建的驱动程序。
⑶测试和调试,自由构建的驱动程序。
⑷调整,自由构建的驱动程序。
⑸附加测试和调试,检查构建与自由构建的驱动程序和操作系统。
⑹测试和检查,最终的自由构建的驱动程序。
2.用VToolD开发驱动程序6
3.用WinDriver开发驱动程序⑴WinDriver的特点:
从用户层访问硬件;支持I/O读写、中断处理、物理内存读写;支持各厂家的PCI、ISA、EISA、ISAnP、PCMCIA、USB总线接口;支持主流PCI接口芯片:
PLX9050/9054/9060/9080、AMCC、Galileo、V3等PCI桥;支持通用Win32软件开发平台,如:
VisualC++、C++Builder,VisualB、Dephi、Java等;应用程序对Win9X与NT/2000二进制代码级兼容,对Win9X、NT2000/CE、Linux源代码级兼容;提供核心插件功能,可用于开发高性能驱动程序(对调试无误的要求苛刻的部分软件通过WinDriver提供的API插入到核心态运行;编程向导界面友好,可进行编程前的硬件诊断,可自动生成大部分驱动程序代码。
⑵开发步骤:
利用编程向导开发:
①插入设计好的板卡,打开WinDriverWizard,待开发板卡资源自动分析,生成驱动程序框架代码;②修改代码,加入定制功能;③在用户态执行与调试代码;④将性能苛刻部分插入到核心态;直接利用WinDriver提供的API函数书写:
①将windriver.h拷贝到应用程序的源代码目录中,以使应用程序可以找到它;②在应用程序的源文件中包含windows.h、winioctl.h、windriver.h三个头文件;③调用WD_Open(函数,打开WinDriver设备驱动程序,获得设备文件句柄;④调用WD_CardRegister(函数,向WinDriverkernal登记板卡信息;⑤调用WD_Transfer(函数,进行I/O和内存数据的存取.当然,也可直接用WD_CardRegister(函数返回的内存映像的线性地址存取硬件上的地址空间;⑥若使用中断的话,可调用WD_IntEnable(函数使能中断,此后可调用WD_IntWait(函数等待中断的到来,停止中断响应可调用WD_IntDisable(函数予以实现;⑦当不需要硬件操作时,可调用WD_CardUnregister(函数取消登记,而后调用WD_Close(函数关闭WinDriver设备驱动程序。
⑶ISA/PCI板卡驱动程序的WinDriver开发演示⑷举例:
WinWriver产生的C++builder的EPP并口API:
①并口开关函数BOOLLPT_O