1、嵌入式系统实验报告嵌入式系统实验报告班级_姓名_学号_王新华 编写信息与电子工程学院2008年4月实验1 S3C2410启动程序实验一、试验目的:1、熟悉ADS软件的使用。2、熟悉汇编语言程序结构和C语言程序结构。3、掌握ARM的异常向量表和堆栈定义。3、掌握ADS环境中代码的调试方法。二、实验仪器及设备: 安装有ADS软件的PC机一台。三、实验步骤:1. 点击D盘“Embedded system expEXP1”文件夹下的工程文件exp1.mcp,打开工程进入“Metrowerks CodeWarrior for ARM Developer Suite v1.2”调试界面。2. 找到Star
2、tup.s文件并打开,阅读汇编语言代码,理解其中的向量定义语句和各常量及变量定义语句。3. 按图1-1所示点击Make按钮编译工程,之后点击Debug按钮启动AXD调试界面,运行调试该代码,采用单步和设断点的方式,观察各指令的运行结果。图1-14. 进入AXD调试环境后,在代码区域点击鼠标右键,显示图1-2的菜单项,选择其中的Disassembly项,进入反汇编状态,可以查看各异常向量的向量地址、各程序标号的地址值、去除伪指令后的实际代码。以后每执行一条语句会自动切换回源代码状态,如果需要查看地址要按同样的方法重新切换到反汇编状态。5. 选择菜单Processor Views中的Registe
3、rs项,打开寄存器窗口,如图1-3所示,在代码执行过程中观察寄存器的值。图1-2图1-36. 选择菜单Processor Views中的Memory项,如图1-4所示,打开存储器窗口,如图1-5所示,该窗口将显示在界面的下端。如果想观察某一个存储地址的值,在地址栏输入地址(十六进制)后回车即可。注意存储器值的存放格式。7. 如果想关闭某一个窗口,只要在相应的窗口中点击鼠标右键,选择Close即可。8. 在代码调试时采用单步step (F10)、单步进入step in(F8)及设置断点(F9)几种方式。在某一行代码位置设置断点时,用鼠标点击该行代码然后按F9即可,该行将显示红色标记,再按F9将取
4、消断点。图1-4图1-59. 参考Starup.s程序代码,调试时完成所要求的内容。四、 Starup.s参考代码; Some ARM920 CPSR bit discriptions;Pre-defined constantsUSERMODE EQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0I_Bit * 0x80F_Bit * 0x40; MMU Register discription;p15
5、 CP 15;c0 CN 0;c1 CN 1;c2 CN 2;c3 CN 3CtrlMMU * 1CtrlAlign * 2CtrlCache * 4CtrlWBuff * 8CtrlBigEnd * 128CtrlSystem * 256CtrlROM * 512;initialization L0 is MMU FULL_ACCESS, DOMAIN, SECTIONTLB_L0_INIT * 0x0C02; Start here; AREA Init,CODE,READONLY IMPORT _use_no_semihosting_swi IMPORT Enter_UNDEF IMPOR
6、T Enter_SWI IMPORT Enter_PABORT IMPORT Enter_DABORT IMPORT Enter_FIQ ENTRY b ColdReset b Enter_UNDEF ;UndefinedInstruction b Enter_SWI ;syscall_handler or SWI b Enter_PABORT ;PrefetchAbort b Enter_DABORT ;DataAbort b . ;ReservedHandler b IRQ_Handler ;IRQHandler b Enter_FIQ ;FIQHandler;deal with IRQ
7、interrupt EXPORT IRQ_HandlerIRQ_Handler IMPORT ISR_IrqHandler STMFD sp!, r0-r12, lr BL ISR_IrqHandler LDMFD sp!, r0-r12, lr SUBS pc, lr, #4;=; ENTRY ;= EXPORT ColdResetColdReset ldr r0,=WTCON ;watch dog disable ldr r1,=0x0 str r1,r0 ldr r0,=INTMSK ldr r1,=0xffffffff ;all interrupt disable str r1,r0
8、ldr r0,=INTSUBMSK ldr r1,=0x7ff ;all sub interrupt disable, 2002/04/10 str r1,r0;*;* Initialize stacks * ;* bl InitStacks ; Stack Setup for each MODE; copy excption table to sram at 0x0; IMPORT |Load$EXCEPTION_EXEC$Base| IMPORT |Image$EXCEPTION_EXEC$Base| IMPORT |Image$EXCEPTION_EXEC$Length| ldr r0,
9、 =|Load$EXCEPTION_EXEC$Base| ;source data ldr r1, =|Image$EXCEPTION_EXEC$Base| ;place exception talbe at 0x0 ldr r2, =|Image$EXCEPTION_EXEC$Length|exception_cploop sub r2, r2, #4 ldmia r0!, r3 stmia r1!, r3 cmp r2, #0 bge exception_cploop; start main function in C language; IMPORT _main BL _main ;Do
10、nt use main() because . B .;*;* The function for initializing stack *;* IMPORT UserStack IMPORT SVCStack IMPORT UndefStack IMPORT IRQStack IMPORT AbortStack IMPORT FIQStackInitStacks ;Dont use DRAM,such as stmfd,ldmfd. ;SVCstack is initialized before ;Under toolkit ver 2.50, msr cpsr,r1 can be used
11、instead of msr cpsr_cxsf,r1 mrs r0,cpsr bic r0,r0,#MODEMASK orr r1,r0,#UNDEFMODE|NOINT msr cpsr_cxsf,r1 ;UndefMode ldr sp,=UndefStack orr r1,r0,#ABORTMODE|NOINT msr cpsr_cxsf,r1 ;AbortMode ldr sp,=AbortStack orr r1,r0,#IRQMODE|NOINT msr cpsr_cxsf,r1 ;IRQMode ldr sp,=IRQStack orr r1,r0,#FIQMODE|NOINT
12、 msr cpsr_cxsf,r1 ;FIQMode ldr sp,=FIQStack ;bic r0,r0,#MODEMASK|NOINT orr r1,r0,#SVCMODE|NOINT msr cpsr_cxsf,r1 ;SVCMode ldr sp,=SVCStack ;USER mode is not initialized. mov pc,lr ;The LR register may be not valid for the mode changes.; End of Startup.c; END五、试验要求及纪录:1、写出各异常向量地址30008000 0xea00000a b
13、 ColdReset30008004 0xea0000c1 b Enter_UNDEF30008008 0xea0000d3 b Enter_SWI3000800c 0xea0000e2 b Enter_PABORT30008010 0xea0000f4 b Enter_DABORT3000801c 0xea000103 b Enter_FIQ2、说明标号Enter_UNDEF、Enter_SWI、Enter_PABORT、Enter_DABORT、 Enter_FIQ的来源文件,说明汇编程序的标号与C语言的函数名称之间的关系。 UHAL.c 汇编程序的标号与C语言的函数名称相同。3、说明WT
14、CON、INTMSK、INTSUBMSK几个常量的来源文件,写出其定义语句。2410addr.s WTCON EQU 0x53000000 ;Watch-dog timer modeWTDAT EQU 0x53000004 ;Watch-dog timer dataWTCNT EQU 0x53000008 ;Eatch-dog timer count4、 单步执行汇编语言程序,同时打开Registers和memory窗口,纪录以下每行语句执行完毕后各寄存器的数值。写在各语句的右面。ColdReset ldr r0,=WTCON;写出该语句执行后r0的值 0x53000000 ldr r1,=0
15、x0;写出该语句执行后r1的值 0x00000000 str r1,r0;写出该语句执行后存储器的值 00000000 ldr r0,=INTMSK;写出该语句执行后r0的值 0x4A000008 ldr r1,=0xffffffff ;写出该语句执行后r1的值 0xFFFFFFFF str r1,r0 ;写出该语句执行后存储器的值 FFFFFFFF ldr r0,=INTSUBMSK;写出该语句执行后r0的值 0x4A00001C ldr r1,=0x7ff;写出该语句执行后r1的值 0x000007FF str r1,r0 ;写出该语句执行后存储器的值 000070FF5、关闭AXD调试环
16、境,在CodeWarrior环境下修改main.c函数,在其中输入下面的代码并重新编译。 unsigned long * ptrw; unsigned short * ptrh; unsigned char * ptrb; unsigned char tempb; unsigned short temph; unsigned long tempw; ptrw = (unsigned long *)0x10000000; ptrh = (unsigned short *)0x10000000; ptrb = (unsigned char *)0x10000000; * ptrw = 0x1234
17、5678; (1) tempw = *ptrw; (2) *ptrw = tempw+1; (3) temph = *ptrh; (4) *ptrh = temph+1; (5) tempb = *ptrb; (6) *ptrb = tempb+1; (7)6、说明ptrw、ptrh、ptrb是什么类型的变量。 指针类型7、 再次运行程序,代开AXD调试环境,在运行到main.c程序时,打开并观察memory窗口中地址0x10000000中的数值,写出上述代码中编号(1)(7)语句执行后tempw、temph、tempb及存储器地址0x10000000中的值。(1)(2)(3)(4)(5)(6
18、)(7)8、 说明上述C语言的代码完成了什么功能。实验2 S3C2410堆栈初始化程序实验一、试验目的:1、熟悉ADS软件的调试方法。2、熟悉汇编语言启动程序的定义,了解ARM的体系结构。3、分析了解初始化代码Startup.s中对堆栈的结构定义。二、实验步骤:1. 点击D盘“Embedded system expEXP2”文件夹下的工程文件exp2.mcp,打开工程进入“Metrowerks CodeWarrior for ARM Developer Suite v1.2”调试界面。2. 找到Startup.s文件并打开,阅读汇编语言代码,理解其中的堆栈定义语句。3. 按照实验1的方法打开寄
19、存器窗口,采用单步和设断点的方式,观察各指令的运行结果。4. 调试时完成以下所要求的内容。三、试验要求及纪录:1、在初始化代码中运行分析和堆栈相关的以下代码,查找其中用到的常数定义数值,运行代码,确定并记录每种模式堆栈区域的起始地址和大小。InitStacksmov r2,lrmrs r0,cpsr bic r0,r0,#MODEMASK orr r1,r0,#UNDEFMODE|NOINT msr cpsr_cxsf,r1 ;UndefMode ldr sp,=UndefStack orr r1,r0,#ABORTMODE|NOINT msr cpsr_cxsf,r1 ;AbortMode
20、ldr sp,=AbortStack orr r1,r0,#IRQMODE|NOINT msr cpsr_cxsf,r1 ;IRQMode ldr sp,=IRQStack orr r1,r0,#FIQMODE|NOINT msr cpsr_cxsf,r1 ;FIQMode ldr sp,=FIQStack orr r1,r0,#SVCMODE|NOINT msr cpsr_cxsf,r1 ;SVCMode ldr sp,=SVCStack orr r1,r0,#USERMODE|NOINT msr cpsr_cxsf,r1 mov pc,r2 记录结果:SVC模式堆栈起始地址: 大小:IRQ
21、模式堆栈起始地址: 大小:FIQ模式堆栈起始地址: 大小:ABORT模式堆栈起始地址: 大小:UNDEF模式堆栈起始地址: 大小:2、问题1) 系统复位后处于哪种工作模式?2) 堆栈初始化完成以后系统处于什么模式?3) 堆栈初始化完成后FIQ中断和IRQ中断是否打开?3、修改程序1) 将InitStacks后面的第3条语句改成以下黑体显示的语句,然后重新编译调试。InitStacksmov r2,lrmrs r0,cpsr bic r0,r0,#MODEMASK orr r1,r0,# USERMODE|NOINT2)观察运行结果,此时的结果和程序修改之前有何不同,为什么?4、 现在要把各堆栈
22、的大小改为8192字节,如何修改,写出具体的定义语句,然后重新编译运行程序,验证修改是否正确。5、分析各寄存器的值,回答以下问题1) BANK0和BANK1的数据总线宽度各是多少?2) BANK0和BANK1的存取周期各是多少?3) BANK6和BANK7的存储器类型各是什么?4) BANK6和BANK7的存储区大小各是多少?实验3 S3C2410 的串行口实验一、试验目的:1、掌握ARM 的串行口工作原理。2、学习编程实现ARM 的UART 通讯。3、掌握CPU 利用串口通讯的方法。二、实验仪器及设备1、安装有ADS软件的PC机一台。2、UP-NETARM 2410试验箱一套。三、实验步骤:
23、1、按指导老师要求连接好试验箱的电源线、JTAG仿真器及串口线,用鼠标点击桌面上的图标arm9.ht,打开超级终端界面,然后开启实验箱电源,此时在超级终端界面中将出现试验箱返回的信息,按下除回车键外的任意键,这时在超级终端界面将会看到下面图3-1 的提示,在vivi后键入load flash ucos x 然后回车。图3-1 超级终端界面I2、 这时将会进入图3-2 的界面。图3-2 超级终端界面3、 然后打开超级终端上方的“传送”菜单并选择“发送文件”,弹出如图3-3 所示窗口,点击浏览按键,查找D:Embedded system expexp3system.bin文件,点击选择该文件.然后
24、在发送文件对话框中的协议栏选择Xmodem,最后选择发送。发送结束后,映象文件即下载到flash 中。图3-34、 然后,如图3-4 键入bootucos 命令再回车运行程序,此时程序已经下载到了试验箱中并且开始运行。此后在整个实验过程中都不要关闭超级终端,它将于调试环境同时使用。5、 点击运行桌面的UarmJtag.exe图标,运行后该界面马上会缩到桌面右下角,如图3-5,用鼠标指针找到该缩小的图标(鼠标指向它时提示ARM JTAG仿真器),点击打开“ARM flash 下载程序”界面如图3-6,然后选择点击其中的“初始化配置”按钮,打开初始化地址设置界面,如图3-7所示,在“处理器类型”选
25、项中选择“ARM9”,点击确定。之后最下化(注意不要关闭,否则需要重复第7步)“ARM flash 下载程序”。图3-4图3-5图3-6图3-76、 点击D盘“Embedded system expEXP3”文件夹下的工程文件exp3.mcp,打开工程进入“Metrowerks CodeWarrior for ARM Developer Suite v1.2”调试界面。7、 阅读main.c文件,熟悉该文件中关于UART的函数及定义语句。8、 运行调试相关代码,采用单步和设断点的方式,同时打开存储器窗口,观察各指令的运行结果。9、 首先在AXD运行环境中全速运行程序(按F5),在超级终端界面中
26、输入任意的字符,将会看到该字符的显示,实际上是试验箱中的程序运行时接收超级终端发送的字符,然后送回该字符,超级终端再将收到的字符显示出来。10、调试时完成以下所要求的内容。三、试验要求及纪录:1、在编辑环境中找到Uart_Init函数,阅读其中的代码,说明在该函数中对哪些寄存器做了初始化,同时说明这些寄存器的功能和在该系统中的实际定义是怎样的。2、记录以下变量及寄存器的数值:PCLK= MHzrUBRDIV0=3、回答以下问题:(1)RdURXH0( ) 是函数吗?写出它的定义语句。(2)WrUTXH0(ch) 是一条什么样的语句?写出它的定义语句。(3)UART0的接收发送状态寄存器是哪一个?在代码main.c中哪一条语句中使用的了它?写出该语句并分析该语句的功能。(4)UART0的波特率是多少?串口接收和发送采用了中断还是查询方式?(5)在超级终端中输入了一个字符,但想让它显示另外的字符,在调试环境中如何实现?(提示:单步运行到发送函数时修改要发送的字符)实验4 S3C2410的AD转换实验一、试验目的:1熟悉ARM 本身自带的八路十位A/D 控制器及相应寄存器。2编程实现ARM 系统的A/D 功能。二、实验内容学习A/D 接口原理,了解实现A/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1