浙江大学城市学院实验报告课程名称:嵌入式操作系统实验2实验名称:ARM汇编程序程序设计与调试学生姓名:专业:学号:同组学生姓名:指导老师:成绩:一、实验目的本实验主要的内容是在CodeWirriorIDE下创建工程;并设置汇编程序开发的相应环境。然后,设置IDE的属性,最后,熟练调试方法。本实验在实验3的基础上,对CodeWirriorIDE集成开发工具和AXD调试器深入学习,重点在于学会在ADS集成开发环境下设置汇编环境,并调试汇编程序,正确应用并口仿真器进行编译、下载、调试。二、实验内容学习ARM汇编程序设计基本知识,掌握汇编程序开发的流程和程序调试方法。三、实验设备1.教学实验箱,PentiumII以上的PC机,硬件多功能仿真器。2.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真器驱动程序。四、实验步骤任务1:建立工程(注意:建立工程模仿下列步骤做,但要求工程名为自己的学号)1.运行ADS1.2集成开发环境(CodeWarriorforARMDeveloperSuite),点击File|New,在New对话框中,选择Project栏,其中共有7项,ARMExecutableImage是ARM的通用模板,选中它即可生成ARM的执行文件。同时,如图1.1还要在Projectname栏中输入项目的名称,以及在Location中输入其存放的位置。按“确定”保存项目。图1.12.在新建的工程中,选择Debug版本,如图1.2,使用Edit|DebugSettings菜单对Debug版本进行参数设置。图1.23.点击DebugSetting按钮,弹出1.3图,选中TargetSetting项,在Post-linker栏中选中ARMfromELF项。按OK确定。这是为生成可执行的代码的初始开关。图1.34.在如图1.4中,点击ARMAssembler,在ArchitectureorProcesser栏中选ARM920T。这是要编译的CPU核。图1.45.在如图1.5中,点击ARMCCompliler,在ArchitectureorProcesser栏中选ARM920T。这是要编译的CPU核。图1.56.在如图1.6中,点击ARMlinker,在output栏中设定程序的代码段地址,以及数据使用的地址。图中的ROBase栏中填写程序代码存放的起始地址,RWBase栏中填写程序数据存放的起始地址。该地址是属于SDRAM的地址。图1.6在options栏中,如图1.7,Imageentrypoint要填写程序代码的入口地址,其他保持不变,如果是在SDRAM中运行,则可在0x0c000000—0x0cffffff中选值,这是16MSDRAM的地址,但是这里用的是起始地址,所以必须把你的程序空间给留出来,并且还要留出足够的程序使用的数据空间,而且还必须是4字节对齐的地址(ARM状态)。通常入口点Imageentrypoint为0xc100000,ro_base也为0xc100000。图1.7在Layout栏中,如图1.8,在Placeatbeginningofimage框内,需要填写项目的入口程序的目标文件名,如,整个工程项目的入口程序是2410init.s,那么应在Object/Symbol处填写其目标文件名2410init.o,在Section处填写程序入口的起始段标号。它的作用是通知编译器,整个项目的开始运行,是从该段开始的。图1.87.在如图1.9中,即在DebugSetting对话框中点击左栏的ARMfromELF项,在Outputfilename栏中设置输出文件名*.bin,前缀名可以自己取,在Outputformat栏中选择Plainbinary,这是设置要下载到flash中的二进制文件。图1.9中使用的是test.bin.图1.98.如果是模拟调试,选择AXD中菜单Options→ConfigureTarget→选择ARMUL,如图1.10所示。ADS开发工具中分别支持二种情况的目标调试,ARMUL目标环境配置,此是AXD链接到用软件模拟的目标机;第二是选择ADP目标环境配置,它是AXD使用Angel调试协议链接到开发板硬件进行的调试。图1.109.到此,在ADS1.2中的基本设置已经完成,可以将该新建的空的项目文件作为模板保存起来。首先,要将该项目工程文件改一个合适的名字,如S3C2410ARM.mcp等,然后,在ADS1.2软件安装的目录下的Stationary目录下新建一个合适的模板目录名,如S3C2410ARMExecutableImage,再将刚刚设置完的S3C2410ARM.mcp项目文件存放到该目录下即可。这样,就能在图1.11中看到该模板。图1.1110.新建项目工程后,就可以执行菜单Project|AddFiles把和工程所有相关的文件加入,ADS1.2不能自动进行文件分类,用户必须通过Project|CreateGroup来创建文件夹,然后把加入的文件选中,移入文件夹。或者鼠标放在文件填加区,右键点击,即出现如图1.12。图1.12先选AddFiles,加入文件,再选CreateGroup,创建文件夹,然后把文件移入文件夹内。可根据自己习惯,更改Edit|Preference窗口内关于文本编辑的颜色、字体大小,形状,变量、函数的颜色等等设置。如图1.13。图1.13任务2:调试方法1.查看/修改存储器内容在AXD窗口中,点击ProcessorViews|Memory,可以在Memorystartaddress输入存储器的起始地址,查看存储器某地址上的内容,双击某一数据,可以修改此存储单元的内容。2.在命令行窗口执行AXD命令在AXD窗口中,点击SystemViews|CommandLineInterface,在提示符下可以输入命令进行调试。如命令setmen地址,数值,存储器位数。setmen0x0,0x2456,32它表示在地址0x0存放4字节的数值0x2456。3.监视变量变化在AXD窗口中,点击ProcessorViews|Watch,用鼠标选中某变量,单击鼠标右键,在弹出的菜单中选中Addtowatch,此变量显示在watch窗口中。4.设置断点将光标定位在要设置断点的某语句处,按F9键。任务3:调试任务(按下列要求对:1.C程序调用汇编程序;2.汇编程序调用C程序;3.自己写一个能进行相互调用的并且实用的程序)C程序调用汇编程序1.建立文件add.s,代码如下:EXPORTaddAREAadd,CODE,READONLYENTRYADDr0,r0,r1MOVpc,lrEND注意:在ADS中编写汇编语句时,每条语句之前最好用一个TAB键隔开,否则可能会提示语法错误。2.C程序代码为:#includestdio.hexternintadd(intx,inty);intmain(){intx,y;scanf(%d%d,&x,&y);printf(%d+%d=%d\n,x,y,add(x,y));return0;}3.程序调试方法(1)首先建立一个工程test3(2)按照图3.1所示建立源程序main.c与add.s,请注意选中”AddtoProject”,并分别输入C源程序与汇编源程序,如图3.2所示。图3.1图3.2(3)在图3.3中设置ARMLinker中Output的ROBase地址设为0x400000。图3.3(4)设置程序开始执行的地址,如图3.4所示。图3.4(5)如图3.5所示,设置程序从main.o开始执行。图3.5(6)执行菜单Procject下的make命令,编译程序。(7)执行程序run,如图3.6所示。图3.6汇编程序调用C程序从汇编程序调用C程序,格式较为简单。其格式为:BLC函数名1.新建一个工程项目test4.mcp2.新建一个init.s文件,这个程序是该项目文件的入口程序,程序代码为:AREAasm,CODE,READONLYIMPORTaddENTRYLDRr0,=0x1LDRr1,=0x20LDRr2,=0x2BLadd;resultsavedinr0B.END3.新建一个main.c程序,程序代码为:intadd(inta,intb,intc){intsum=0,i;for(i=a;i=b;i=i+c)sum=sum+i;returnsum;}3.在ADS1.2集成开发环境(CodeWarriorforARMDeveloperSuite)选择微处理器、ROBase地址、程序执行的首地址、程序开始执行的函数Init.o等环境参数。微处理器:ROBase地址:程序执行的首地址:程序开始执行的函数Init.o:4.选择菜单Project|Make后,点击Project|Debug,转入AXD环境。5.在AXD环境中,调试过程中把变量a、b、c、i、sum添加到Watch窗口,然后进行单步调试(按F10)。观察这些变量的变化情况。自己完成一个实用并且能相互调用的程序五、实验步骤记录六、实验心得