嵌入式实验指导书.doc_第1页
嵌入式实验指导书.doc_第2页
嵌入式实验指导书.doc_第3页
嵌入式实验指导书.doc_第4页
嵌入式实验指导书.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式实验指导书 1.1.2实验内容1.观看ADS安装视频文件“ADS安装视频文件.avi”;2.观看实验一视频文件“实验一.avi”;3.编写程序实现如下目的从汇编语言切换到C语言代码,然后在C代码中分别使用内嵌汇编语言和汇编子函数的方法实现同一功能(加函数功能)。 1.1.3预备知识1.ARM汇编语言基础知识;2.C语言基础知识;3.程序调试的基础知识和方法。 1.1.4实验设备1.硬件JXARM9-2410教学实验箱、PC机;2.软件PC机操作系统Windows98( 2000、XP)ADT IDE集成开发环境ADS1.2集成开发环境。 1.1.5实验原理1.ADS1.2的安装 1、运行ADS光盘中的setup.exe程序,出现如下图所示界面,并点击“Next”按钮。 2、出现下图所示对话框,电机“Yes”按钮。 3、出现下图所示对话框,在“Destination Folder”中电机“Browse”按钮选择ADS1.2的安装路径,此处选择缺省安装路径,然后选择“Next”按钮。 4、如下图所示,选择“Typical”,然后点击“Next”按钮。 5、如下图所示选择“Next”按钮。 6、如下图所示选择“Next”按钮。 7、如下图所示选择“Next”按钮。 8、将开始安装,如下图所示。 9、程序安装完成之后将提示如下对话框。 10、点击“下一步”将提示下图所示对话框。 11、在“License FileTo BeInstalled”中点击“Browse”按钮选择您的License文件位置,然后点击“下一步”。 12、点击“完成”。 13、点击“Finish”。 14、至此,安装完成,如下图所示,从开始菜单中选择运行ADS。 15、ADS运行界面如下图所示。 2.汇编语言和C语言混合编程在ARM编程中,一个程序往往采用汇编语言和C语言混合编程。 本实验的目的就是为了讲解ARM中C语言和汇编语言混合编程的方法。 1)汇编语言切换到C语言的方法C语言中定义的函数名在汇编语言中可以作为标号使用,因此,在汇编语言中可以使用程序分支指令直接转移到C语言中定义的标号(函数)中。 下面代码实现从汇编语言跳转到C语言的Main函数中汇编代码ENTRY;mark thefirst instructionto call_start MOVsp,#0x33000000;/*建立栈指针(r13)*/B Main;/*跳转到C语言程序*/C代码void Main()在上面的代码中,ENTRY指定程序的入口点为其后的第一条有效指令,此处为MOV指令,该MOV指令设置栈指针r13,在正确调用C语言之前必须正确设置栈指针到系统的ram中,否则调用C语言函数之后肯能会产生异常。 接下来调用Main函数,直接进入C语言调用。 2)汇编语言中函数的实现ARM编程中不同语言的程序只要遵守ATPCS规则就可实现不同语言间的相互调用。 程序间的相互调用最主要的是解决参数传递问题。 应用程序之间使用中间寄存器及数据栈来传递参数,其中,第14个参数使用r0r3传递,多于4个参数则使用数据栈进行传递。 输出参数由r0传递。 下面的代码就是用汇编语言写的一个简单函数。 asse_add ADD r0,r0,r1/*r0=r0+r1*/MOV pc,lr/*函数返回*/它相当于如下声明的C语言函数int asse_add(int x,int y);在汇编语言中可以使用BL asse_add指令调用该函数。 输入时,r0为x参数,r1为y参数,输出r0,该函数实现功能很简单,返回参数x与y的和。 3)C语言调用汇编文件中的函数以上面的asse_add函数为例,在C语言中声明该函数在其他文件中实现extern int asse_add(int x,int y);然后就可以象调用C函数一样调用该函数x=asse_add(10,20);4)C语言中内嵌汇编语言GCC支持大部分基本的内嵌汇编语言。 如下示例为C语言中采用内嵌汇编语言的方式实现asse_add相同的功能。 int embed_add(int x,int y)int tmp;_asmadd tmp,x,y;return tmp;3.建立一个新的工程打开ADS1.2,点击“File-New菜单”,弹出New对话框,如下图所示设置。 在“Project”页中的左边一栏选择“ARM ExecutableImage”,在“Project Name”中输入工程名“leddemo”,在Location中选择工程保存路径,此处为“D:workexamples_adsleddemo”,请注意,输入工程名后,在Location路径的后面将自动将工程名最为一个目录追加到Location后面。 设置完成后,请点击“确定”按钮。 这个操作将在“D:workexamples_adsleddemo”目录建立一个名为“leddemo”的工程。 4.创建一个新文件并加入到工程新建一个文件并保存为D:workexamples_adsleddemoleddemo.c。 点击“File-New菜单”出现如下图所示对话框,选择“File”页,并在“File Name”中输入文件名“leddemo”,在“Location”中输入文件保存路径“D:workexamples_adsleddemo”。 然后将“Add toproject”选中,在Targets中将可显示,并按照下图进行显示。 5.工程设置如下图所示,在工程串口点击工程设置图标将打开工程设置对话框。 本实验需要正确设置以下几个部分1)RO BaseRO Base是程序映像文件只读数据段的起始地址,通常这部分地址必须为存储器,在本实验必须正确的设置到SDRAM起始地址0x30000000地址处,在后续的实验中也将采取这一设置,如果没有设置这个值将缺省指定为0x8000,而这个地址在本系统中为FLASH,是不可写的,因此程序将不能正确地下载和调试。 5.工程设置要点正确设置如下图所示2)Layout中的设置Layout中设置映像文件的组织形式,如那个放在头部,那个放在尾部,通常只需要指定正确的头部就可以。 而且通常需要指定汇编文件的某个段为映像文件的头,在本实验中头为汇编代码asse.s中指定的init段。 AREA Init,CODE,READONLY;name thisblock ofcode因此需要请按照下图进行设置。 3)优化选项的设置在实验中为了更好地使用调试功能,通常将优化功能关闭。 如下图所示在“Optimization Level”设置中选择“Minimum”。 1.1.6实验步骤1.如果ADS1.2没有安装,请参照1.1.5节中的描述以及“ads安装视频文件.avi”视频文件安装ADS1.2。 2.观看“实验一.avi”视频文件,并打开“CodeWarrior forARM DeveloperSuite”,然后创建一个新工程。 3.点击“File”-“New”菜单,新建文件asse.s,参考1.1.7节代码该文件。 4.点击“File”-“New”菜单,新建文件main.c,参考1.1.7节代码该文件。 5.参照视频文件进行编译和调试,请注意以下几个方面的内容1)“RO Base”的设置;2)“Object/Symbol”以及“Section”的设置;3)“Optimization Level”的设置;4)变量的观察方法。 1.1.7实验参考程序本程序的入口点在asse.s文件的MOV指令。 设置栈指针后调用C语言实现的Main函数,然后在Main函数中分别调用汇编语言实现的函数asse_add以及C语言内嵌汇编语言实现的embed_add函数,这两个函数实现x和y值相加,通过调用相同的x,y参数看两个函数调用的结果是否相同。 1.asse.s;/*;*汇编语言编写实验;*该程序演示C语言和汇编语言的相互调用方法;*/IMPORT Main;The mainentry ofmon programEXPORT asse_add AREA Init,CODE,READONLY;name thisblock ofcode numEQU20;/*;*程序入口地址,传递参数并设置堆栈;*/ENTRY;mark thefirst instructionto call_start MOVsp,#0x33000000;/*建立栈指针(r13)*/B Main;/*跳转到C语言程序*/B_start;/*死循环,Main程序执行完成后将重新运行Main函数,永远不退出*/;/*;*intasse_add(int x,int y);*/asse_add ADD r0,r0,r1;/*r0=r0+r1*/MOV pc,lr;/*函数返回*/END2.main.c/*C语言演示程序*/extern intasse_add(int x,int y);int embed_add(int x,int y);void Main()int x,y;/*调用汇编函数asse_add*/x=asse_add(10,20);y=embed_add(10,20);int embed_add(int x,int y)int tmp;_asmadd tmp,x,y;return tmp;1.1.8实验报告要求1.简述如何实现汇编语言与C语言相互调用?2.简述如何设置程序入口点?1.2BOOTLOADER启动代码的设计1.2.1实验目的1.掌握BOOTLOADER基本功能程序下载和程序加载;2.掌握烧写BOOTLOADER到FLASH的方法;3.掌握BOOTLOADER裁减的基本概念和方法;4.掌握基本的串口、定时器和看门狗的用法。 1.2.2实验内容1.观看视频文件“bootloader的调试、烧写和裁减.avi”;2.观看视频文件“时钟、看门狗、串口操作以及BOOTLOADER引导.avi”;3.建立BOOLOADER工程(eg2_boot)并通过仿真器下载调试;4.将下载调试成功的BOOTLOADER程序烧写到FLASH,掉电运行;5.建立eg2工程,实现如下功能编写汇编程序和C程序,C程序进行定时器初始化,编写启动看门狗和关闭看门狗子程序;编写串口初始化程序(波特率115200),串口接收子程序和串口发送子程序;设置时钟10ms中断一次并开中断,并设置计时全局变量;C主程序为循环函数,检查计时变量,每2秒向串口发送数据“T”,并查询接收串口数据,收到数据向串口转发。 汇编中的IRQ中断调用C中断服务程序,C中断服务程序察看是那种中断,是定时器中断则计时全局变量加一。 6.将eg2通过仿真器下载调试;7.制作eg2映像文件,并使用eg2_boot的BOOTLOADER通过串口将其下载到内存,并由BOOTLOADER引导运行。 1.2.3预备知识1.ADS工程建立、设置基本知识;2.C语言基础知识;3.程序调试的基础知识和方法。 1.2.4实验设备1.硬件JXARM9-2410教学实验箱、PC机;2.软件PC机操作系统Windows98( 2000、XP)ADT IDE集成开发环境ADS1.2集成开发环境。 1.2.5实验原理1.BOOLOADER的特性和基本功能BOOTLOADER是位于系统复位入口点(对于ARM处理器,复位入口点为0地址)的一段程序,该程序能够实现复位运行,也就是它的运行不需要依赖于仿真器等辅助调试手段,而通常的做法是将其烧写到FLASH中运行(通常复位入口点处为FLASH等存储介质)。 BOOTLOADER通常由汇编语言和C语言编程实现,且引导部分代码用汇编语言编写。 BOOTLOADER通常用于辅助调试功能,各种不同的BOOTLOADER具有的功能不尽相同,但是一般都具有下面的两个功能 1、程序下载功能通过一定的通信手段(串口通信或者以太网通信)将代码从宿主机下载到目标系统(ARM)的存储器。 2、程序加载功能从指定的地址引导用户程序。 2.启动代码分析在启动代码中主要完成一些重要的硬件初始化动作,下面针对本实验eg2中的启动代码进行分析1)异常跳转表ENTRY bResetHandler bHandlerUndef;handler forUndefined modeb HandlerSWI;handler forSWI interruptb HandlerPabort;handler forPAbort bHandlerDabort;handler forDAbort b.;reserved bHandlerIRQ;handler forIRQ interruptb HandlerFIQ;handler forFIQ interrupt如上面的代码所示,异常跳转表为程序起始位置4832个字节的代码空间,它必须设置为程序入口点,且在这32个字节中分别放置8条跳转指令,分别跳转到对应异常的处理代码。 常用的有两个,一个为复位异常,在上面的程序中直接跳转到ResetHandler处运行,另外一个为IRQ中断异常,在上面的程序中直接跳转到HandlerIRQ处运行。 2)系统初始化在ResetHandler处为复位运行的入口点,在这里通常首先进行一些系统初始化的操作。 如下所示代码首先关闭看门狗和中断,然后存储控制寄存器的值,如SDRAM等存储器参数的初始化就是在这里进行。 ResetHandler ldr r0,=WTCON;关闭看门狗ldr r1,=0x0str r1,r0ldr r0,=INTMSK ldr r1,=0xffffffff;关闭中断str r1,r0ldr r0,=INTSUBMSK ldr r1,=0x3ff;关闭二级子中断str r1,r0;To reducePLL locktime,adjust theLOCKTIME register.ldr r0,=LOCKTIME ldr r1,=0xffffff str r1,r0;Set memorycontrol registersldr r0,=SMRDATA ldr r1,=BWSCON;BWSCON Addressadd r2,r0,#52;End address of SMRDATA0ldr r3,r0,#4str r3,r1,#4cmp r2,r0bne%B03)堆栈初始化接下来通过调用bl InitStacks进行堆栈初始化,由于在C语言中用到了堆栈,如声明一个局部变量就有可能是从堆栈中分配,因此在切换到C语言之前必须进行堆栈的初始化。 InitStacks的实现代码请参考1.2.7节。 4)段初始化在运行C语言之前,必须将其各个段按照一定的规则进行初始化。 主要有RW段的正确搬移和ZI段的清零。 程序代码通常被放置于RO段中,这部分只要求具有只读属性,因此可以在FLASH和RAM中,而一些变量等则放置于RW段中,这部分则必须在RAM中。 在前面的实验中我们已经知道在工程中可以设置RO Base和RW Base,可以设置为它们连续,也可以设置它们到不同的地址,因此这两段之间是可能存在空隙的。 而通过fromELF工具制作的映像文件(也就是执行代码)直接将RW连接到RO段的后面,而不管它们中间是否有间隙。 因此在启动代码中通常需要将RO段后的RW段数据拷贝到正确的地址。 下面的代码将从|Image$RO$Limit|(RO段的尾部,也就是RW的头部)指定的位置开始一直到|Image$ZI$Base|(ZI的头部,也就是RW的尾部)拷贝到|Image$RW$Base|开始的位置。 ;Copy andpaste RWdata/zero initializeddata ldr r0,=|Image$RO$Limit|;Get pointerto ROM data ldr r1,=|Image$RW$Base|;and RAMcopy ldr r3,=|Image$ZI$Base|;Zero initbase=top ofinitialised datacmp r0,r1;Check thatthey aredifferent beq%F21cmp r1,r3;Copy initdata ldrr2,r0,#4;-LDRCC r2,r0+ADD r0,r0,#4str r2,r1,#4;-STRCC r2,r1+ADD r1,r1,#4b%B1另外还需要将ZI段的数据清零,下面的代码就是实现这个功能,它将从|Image$ZI$Base|(ZI的头部)到|Image$ZI$Limit|中间的内容全部请零。 2ldr r1,=|Image$ZI$Limit|;Top ofzero initsegment movr2,#03cmp r3,r1;Zero initstr r2,r3,#4b%B35)开始运行C代码bl Main;开始运行C代码.3.程序下载功能实现本程序实现了通过串口接收程序的功能,通过下面的函数实现将主机端的程序下载到addr地址。 在主机端使用MTTTY.EXE软件的“Send FileWith Size(Text)”功能,选择待发送的文件,然后将计算文件大小并将大小发送到串口,此时目标机通过Uart_GetIntNum函数获取该大小,并开始从串口接收由MTTTY发送过来的其余的数据,保存在从addr地址起始的位置。 void Uart_Get_Data(unsigned intaddr)unsigned char*pData;int size;pData=(unsigned char*)addr;/*获取待下载程序大小*/Uart_Printf(Please enterthe sizeof fileto bedownloaded:);size=Uart_GetIntNum();Uart_Printf(rnDownloading,size=%d(0x%x).rn,size,size);/*开始下载,即从串口接收数据并放到addr开始的内存位置*/while(int)(pData-(unsigned char*)addr) 这种功能如果使用汇编语言很容易实现ldr pc,=0x30000000如果使用C语言则必须使用函数指针,首先定义一个函数指针fp,并将加载地址(0x30000000)赋值给fp,也就是指定fp代表的函数的运行地址为0x30000000,最后跳转到该函数处运行。 void FuncDemo_Start()FuncDemo_Entry fp;/*fp为函数指针,首先将其地址设置为0x30000000,然后执行函数指针指向的函数,相当于一条汇编指令:ldr pc,=0x30000000*/fp=(FuncDemo_Entry)0x30000000;(*fp)();4.BOOTLOADER功能的裁减BOOTLOADER和其它嵌入式软件一样,一般都具有可以裁减的功能,本实验以BOOTLOADER的TFTP下载功能为例简单介绍一下如何在BOOTLOADER中添加和裁减某一功能。 从1.2.7可以看出,在Main函数中有这样一段代码#ifdef CFG_TFTP case3:/tftp下载Tftp_Get_Data(0x30000000);break;#endif这段代码首先判断CFG_TFTP宏是否定义,如果没有定义则在它和#endif中间的代码都不会参加编译,也就是将该功能裁减了,如果定义了CFG_TFTP宏则具有该功能,也就是添加了该功能。 因此添加或者裁减该功能首先需要定义/注释下面这行代码。 #define CFG_TFTP另外如果定义了CFG_TFTP宏,则需要添加TFTP相关支持代码,下图所示,tftp目录下的为本实验TFTP支持代码,下面作一个简要说明,更加详细的了解请参考代码。 TFTP协议是一种微小的FTP协议,需要使用以太网设备,因此在TFTP支持代码中既有硬件相关的驱动层代码也有硬件无关的协议层代码。 下图的S3c2410.c文件中就包含RTL8019网络驱动,是与本系统硬件相关的,而其它的代码则主要实现各种网络协议,它们都是与硬件无关的代码。 4.通过仿真器调试BOOTLOADER程序BOOTLOADER虽然是可以复位运行的程序,但是在最开始也是需要调试的,下面讲述如何通过仿真器调试BOOTLOADER程序。 要通过仿真器调试BOOTLOADER程序,则必须使其运行于SDRAM中,并正确地指定程序入口点。 下面两个图分别设置RO Base以及Layout中的内容。 按照上面的设置编译后,下载运行方法和上一个实验中的方法相同。 7.BOOTLOADER复位运行的实现上面设置的BOOTLOADER程序必须通过仿真器下载到0x30000000或者通过其它的引导程序引导到0x30000000才能正确运行,而系统复位运行点为0地址,0地址为FLASH存储介质,也就是说该程序是没有办法复位自动运行的。 因此必须将RO Base设置为0x0地址,但是,如果这样设置的同时必须将RW Base设置到SDRAM位置(RW Base必须具备读写属性,不能在FLASH中),此处设置为0x33ff0000。 如下图所示这样设置后还必须制作映像文件,如下图所示,在“Target Settings”的“Post-linker”中选择“ARM fromELF”。 编译后在编译目录下将看到除了生成eg2_boot.axf以外,还多了一个eg2_boot.bin文件,这个文件就是映像文件,它可以烧写到FLASH并运行。 接下来就需要通过ADT IDE的FLASH编程器将eg2_boot.bin文件烧写到FLASH的0地址。 首先启动ADT IDE,然后点击“Debug”-“Flash Programmer”。 在出现的对话框中按照下图进行选择,请注意,在“device”中,如果使用简易JTAG请选择“Arm9Simple”,如果使用标准JTAG请选择“Arm9Lpt”。 选择后,请将实验箱上电,并正确连接调试器,然后点击“Erase”按钮擦除FLASH,提示成功后,点击“Program”按钮编程FLASH,提示成功后点击“Cancel”按钮退出。 然后将实验箱重新上电,如果一切正常,eg2_boot程序将自动复位运行。 8.eg2中的串口编程串口编程包括下面三个主要的过程1)串口初始化如下面代码所示,Uart_Init的第一个参数为总线时钟,0表示使用系统缺省时钟PCLK,第二个参数为波特率115200。 然后调用Uart_Select选择串口0进行操作。 /*初始化串口*/Uart_Init(0,115200);Uart_Select (0);2)向串口发送数据下面的语句将向串口发送一个ch字符Uart_SendByte(ch);3)从串口接收数据下面的语句将从串口接收字符,如果没有数据则返回0,如果有数据则返回接收到的数据。 Uart_GetKey();9.eg2中的定时器编程本实验使用定时器1,每10ms触发一次定时器中断,并在定时器中断服务函数中设置计时全局变量。 首先必须初始化定时器,通过调用函数Init_Timer1实现,在该函数中,将初始化定时器特殊功能寄存器并注册中断。 初始化完成后将调用Start_Timer1函数启动定时器。 此时,将不断产生中断。 10.eg2中的看门狗定时器编程看门狗功能是在嵌入式系统中常用的功能,它实际上是一个计数器,为该计数器设定一个计数值,也就是一个周期,在此周期内必须给看门狗喂狗(重置计数值),否则,计数器溢出将导致其产生复位信号,导致系统复位。 S3C2410内置看门狗功能,操作非常简单,首先通过Watchdog_Init函数打开看门狗功能。 然后在Main函数中每隔2秒钟喂狗一次。 如果已经打开看门狗但是没有喂狗或者没有及时喂狗,将导致系统复位,实验中,请将喂狗功能去掉,并下载运行看看实验效果。 11.如何由BOOTLOADER下载和加载eg2eg2调试通过后,将制作映像文件,如下图所示,在“Target Settings”的“Post-linker”中选择“ARM fromELF”。 编译后在编译目录下将看到除了生成eg2.axf以外,还多了一个eg2.bin。 然后将系统上电运行eg2_boot程序,在主机端使用MTTTY.EXE软件,并输入“1”启动程序下载功能,并点击MTTTY的“Send FileWith Size(Text)”功能,选择待发送的文件为上面生成的eg2.bin文件。 下载完成后输入“2”启动程序加载功能,将自动加载刚才通过串口下载下去的eg2.bin程序。 1.2.6实验步骤1.观看视频文件“bootloader的调试、烧写和裁减.avi”;2.观看视频文件“时钟、看门狗、串口操作以及BOOTLOADER引导.avi”;3.建立BOOLOADER工程(eg2_boot);4.设置并编译eg2_boot,然后通过仿真器下载调试;5.将下载调试成功的BOOTLOADER程序烧写到FLASH,掉电运行;6.建立eg2工程,并代码,实现要求的功能;6.编译eg2过程,并将eg2通过仿真器下载调试;7.制作eg2映像文件,并使用eg2_boot的BOOTLOADER通过串口将其下载到内存,并由BOOTLOADER引导运行。 1.2.7实验参考程序eg22410init.s;=;NAME:2410INIT.S;DESC:Start Codefor JXARM9-2410;1.Exception vectortable;2.Configure memory,ISR,stacks;3.Initialize C-variables;4.Interrupt Handle;HISTORY:;xx.06.25:cooljet:ver1.0;=;=;include files;=GET2410addr.inc GET2410option.inc GET2410memcfg.inc;=;Pre-defined constants;=BIT_SELFREFRESH EQU(1top ofinitialised datacmp r0,r1;Check thatthey aredifferent beq%F21cmp r1,r3;Copy initdata ldrr2,r0,#4;-LDRCC r2,r0+ADDr0,r0,#4str r2,r1,#4;-STRCC r2,r1+ADDr1,r1,#4b%B12ldrr1,=|Image$ZI$Limit|;Top ofzeroinitsegment movr2,#03cmp r3,r1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论