大学ARM嵌入式实验报告

《嵌统》

实验报告

       姓名: 

       学号:

       班级:

       

        

            20##年4月

实验一  ARM汇编指令实验1

一、实验目的

1.初步学会使用ADS1.2 开发环境及ARM软件模拟器;

2.通过实验掌握简单ARM汇编指令的使用方法。

二.实验设备

1.硬件:PC机;

2.软件:ADS1.2集成开发环境。Windows98/2000/NT/XP。

三.实验内容

1.熟悉开发环境的使用,并使用LDR/STR和MOV等指令访问寄存器或存储单元。

2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

四.实验原理

ARM处理器共有37个寄存器:31个通用寄存器,包括程序计数器(PC),这些寄存器都是32位;6个状态寄存器,这些寄存器也是32位,但只使用了其中的12位。

1.ARM通用寄存器

通用寄存器(R0~R15)可分为3类,即不分组寄存器R0~R7.分组寄存器R8~R14.程序计数器R15。

2.  存储器格式

ARM体系结构将存储器看作是从零地址开始的字节的线性组合。字节0~3存放第一个字,字节4~7存放第2个字,以此类推。

       ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。

五.实验程序

1. 实验A参考程序

X EQU 45                         :定义变量x,并赋值为45

Y EQU 64                            :定义变量y,并赋值为64            

STACK_TOP EQU 0x1000          :定义栈顶0x1000

                                                   

              AREA Example,CODE,READONLY     :声明代码段

              ENTRY                             :标识入口

                                                                

START   

       

              MOV      SP,#STACK_TOP

              MOV R0,#X                        :x的值放入R0 

              STR R0,[SP]                             :R0的值保存到堆栈 

              MOV R0,#Y                        :y的值放入R0 

              LDR R1,[SP]                             :取堆栈中的数到R1 

              ADD       R0,R0, R1

              STR R0,[sp]

      

STOP    B STOP              :死循环

        END                 :结束

2. 实验B参考程序

X EQU 45                  :定义变量x,并赋值为45

Y EQU 64                  :定义变量y,并赋值为64

Z EQU 87                  :定义变量z,并赋值为87

STACK_TOP EQU 0X1000    :定义堆栈顶0x1000

           AREA HUXIANG,CODE,READONLY       : 声明代码段,只读

           ENTRY                                 : 标识入口

START 

          MOV R0,#X                :x的值放入R0

              MOV R0,R0,LSL#8          :R0的值乘以2的8次方 

              MOV R1,#Y                :y的值放入R1

              ADD R2,R0,R1,LSR#1       :R1的值除以2加上r0的值放入R2 

              MOV SP,#0X1000           

              STR R2,[SP]

              MOV R0,#Z                 :z的值放入R0

              AND R0,R0,#0XFF           :取R0的低八位

              MOV R1,#Y                 :y的值放入R1

              ADD R2,R0,R1,LSR#1        :R1的值除以2加上r0的值放入R2

              LDR R0,[SP]                 :y的值放入R1

              MOV R1,#0X01

              ORR R0,R0,R1

              MOV R1,R2                  :y的值放入R1

              ADD R2,R0,R1,LSR#1         :R1的值除以2加上r0的值放入R2

             

STOP B  STOP                       :死循环

        END                         :结束

六.实验结果及分析

1. 程序A的实验结果截图如下:

 


实验分析;

    本实验使用LDR、STR、MOV等指令访问寄存器和存储单元,使用堆栈和寄存器R0,R1存储变量。

2. 程序B的实验结果截图如下:

 


实验分析:

本实验使用ADD、SUB、LSL、LSR、AND、ORR等指令,完成基本数学/逻辑运算。

 

实验二  ARM汇编指令实验2

一、实验目的

通过实验掌握使用LDM/STM、B和BL等指令完成较为复杂的存储区访问和程序分支,学习使用条件码,加强对CPSR的认识。

二、实验设备

1.硬件:PC机;

2.软件:ADS1.2集成开发环境。Windows98/2000/NT/XP。

三、实验内容

1.熟悉开发环境的使用并完成一块存储区的拷贝;

2.完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。

四、实验原理

1.ARM程序状态存储器

在所有处理器模式下,都可以访问当前程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的状态。CPSR和SPSR的格式如下:

31  30  29 28  27 26        8  7  6  5   4   3   2   1   0

2.本实验涉及到得as语法及规则

1)标号的使用

标号由一个符号后跟一个冒号组成,它表示程序中当前的指令或者数据地址。如果在程序中出现两个相同的标号,汇编器会产生一个警告,同时,只有第一个标号有效。

2)几个伪指令

(1)LDR

LDR伪指令讲一个32位常数或者一个地址值读取到寄存器中。当需要读取到寄存器中的数据超过了MOV或者MNV指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。在汇编编译器处理源程序时,如果该常数没有超过MOV或者MNV可以操作的范围,则LDR指令被这两条指令中的一条所替代;否则,该常数将被放在最近的一个文字池(Literal Pool)内,同时,本指令被一条基于PC的LDR指令代替。

语法格式

LDR<register>, = <expression>

其中,expression 为需要读取的32位常数。Register 为目标寄存器。

示例

LDR r1,=0xff

LDR r0,=0xfff0000

(2) ADR

ADR指令将基于PC的地址值或者给予寄存器的地址值读取到寄存器中。在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或者SUB指令来实现该伪指令的功能。如果标号超出范围或者标号在他那个一文件(和同一段)内没有定义,则会产生一个错误,该指令不使用文字池。

语法格式

ADR <register> <label>

其中,register 为目标寄存器。Label为基于PC或者寄存器的地址表达式。

示例Label1:

 MOV r0,#25

 ADR r2,label1

(3).ltorg

 .ltorg 伪操作用于在当前段(一般是. Text段)的当前地址(字对准地址)产生一个文字池。

语法格式

. Ltorg

五、实验程序

NUM EQU 20

        AREA HUXIANG3,CODE,READONLY

        ENTRY

       

START   LDR R0,=SRC

        LDR R1,=DST

        MOV R2,#NUM

        MOV SP,#0X400

       

BLKCOPY MOVS R3,R2,LSR#3

        BEQ COPYWORDS

        STMFD SP!,{R4-R11}

       

OCTCOPY LDMIA R0!,{R4-R11}

        STMIA R1!,{R4-R11}

        SUBS R3,R3,#1

        BNE OCTCOPY

        LDMFD SP!,{R4-R11}

       

COPYWORDS ANDS R2,R2,#7

          BEQ STOP

WORDCOPY LDR R3,[R0],#4

         STR R3,[R1],#4

         SUBS R2,R2,#1

         BNE WORDCOPY

        

STOP    B STOP

SRC       DCD   1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4

DST       DCD    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

        END

六、实验结果及分析

程序的实验结果截图如下

 

实验分析:

    程序将数据从源数据区snum复制到目标数据区dumn,数据的个数num假定为20,复制时以8个字为单位进行,对于最后不足8个字的数据,以字为单位进行复制。

实验三  汇编与C语言的相互调用实验

一、实验目的

1.阅读Embest S3CEV40启动代码,观察处理器启动过程。

2.学会使用Embest IDE辅助信息窗口来分析判断调试过程和结果

3.学会在Embest IDE环境中编写、编译与调试汇编和C语言相互调用的程序。

二、实验设备

1.硬件:PC机;

2.软件:Embest IDE 2004集成开发环境。Windows98/2000/NT/XP。

三、实验内容

使用汇编完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,存放到数组中。

四、实验原理

   1ARM过程调用ATPCS(ARM)

ATPCS是一系列规定应用程序之间相互调用的基本规则,包括:

l   支持数据栈限制检查;

l   支持只读段位置无关(ROPI);

l   支持可读/写段位置无关(RWPI);

l   支持ARM程序和Thumb程序的混合使用;

l   处理浮点运算。

使用以上规定的ATPCS规则是,应用程序必须遵守如下:

l   程序编写遵守ATPCS;

l   变量传递以中间寄存器和数据栈完成;

l   汇编器使用-apcs开关选项。

关于其他ATPCS规则,用户可以参考ARM处理器相关书籍或登录ARM公司网站。

程序只要遵守ATPCS相应规则,就可以使用不同的源代码来编写程序。程序间的相互调用最主要的是解决参数传递问题。应用程序之间使用中间及数据栈来传递参数,其中,第1~4个参数使用R0~R3,多用4个参数数据栈进行传递。这样,接受参数的应用程序必须知道参数的个数。

但是,在应用程序被调用时,一般无从知道所传递参数的个数。用不同语言编写的应用程序在调用时可以自定义传递的约定。使用具有一定意义的形式来传递,可以很好地解决参数个数的问题。常用方法是把第1个或最后1个参数作为参数个数(包括个数本身)传递给应用程序。ATPCS中寄存器的相应关系如表3.1所列。

表3.1   ATPCS规则中寄存器列表

2main( )__gccmain( )函数

当应用程序中包含了main( )函数时,会引起对C运行时库的初始化。该初始化是通过函数__gccmain( )实现的,即在main( )函数入口处,编译器会首先调用__gccmain( )函数,然后才是执行编写的代码。__gccmain( )函数在GCC的标准库里实现。当应用程序中没有包含main( )函数时,不会引起对C运行时库的初始化。这时,C运行时库的很多功能在应用程序中是不能使用的。

如果使用main( )函数作为应用程序的主函数,那么可以在源代码中间加入一个空的__gccmain( )函数(用C语言或汇编语言即可)

五、实验操作步骤

1. 创建新的工程,工程名为explasm。

2. 按照参考程序,重新编写源代码文件,并分别保持为 randtest.c、init. s、random. s和ldscript,并把它们加入工程中。

3. 按照编译→汇编器设置→链接器设置→调试器设置来设置新工程,并编译、链接工程。

4.下载调试文件,打开Memrory/Register/Watch/Variable/Call Stack窗口,单步执行程序。通过以上窗口,跟踪程序运行,观察分析并记录运行结果,通过实验学会使用Embest IDE进行应用程序的开发与调试。

六、实验参考程序

1.randtest.c参考源代码

 


2.init.s参考源代码

3.random.s参考源代码

运行结果:

 

 

第二篇:嵌入式ARM串口实验报告

实验五  串口通信实验

1  实验目的

(1)  掌握ARM的串行口工作原理;

(2)  编程实现ARM的UART通讯;

(3)  掌握S3C2410寄存器配置方法。

2  实验设备

(1)  S3C2410嵌入式开发板,JTAG仿真器。

(2)  软件:PC机操作系统Windows XP,ADS1.2集成开发环境,仿真器驱动程序,超级终端通讯程序。

3  实验内容

实现查询方式串口的收发功能。接收来自串口(通过超级终端)的字符并将接收到的字符发送到超级终端。

4  实验步骤

(1)  参照模板工程,新建一个工程UART,添加相应的文件,并修改UART的工程设置;相关设置如下列图所示:

图5.1  设置R0 Base

图5.2  添加Target

图5.3  配置

(2)  创建xinint.c和init.c并加入到工程UART中;

(3)  编写串口操作函数实现如下功能:循环接收串口送来的数据,并将接收到的数据发送回去;

参考代码如下:

(1)串口初始化程序

MMU_Init();                                           //初始化内存管理单元

                                                                    //设置系统时钟

    ChangeClockDivider(1,1);              // 1:2:4   

    ChangeMPllValue(0xa1,0x3,0x1);        // FCLK=202.8MHz 

    Port_Init();                                         //初始化I/O口

    Uart_Init(0,115200);                         //初始化串口

    Uart_Select(0);                                     //选择串口0

(2)发送数据

while(!(rUTRSTAT0&0x2));         //等待发送缓冲空

rUTXH0=data;                        //将数据写到数据端口

(3)接收数据

while(rUTRSTAT0&0x1==0x0);       //等待数据

data=rURXH0;                        //读取数据(4)  编译UART;

(5)  将计算机的串口接到开发板的UART0上;

(6)  运行超级终端,选择正确的串口号,并将串口设置位:波特率(115200)、奇偶校验(None)、数据位数(8)和停止位数(1),无流控,打开串口;

(7)  运行程序,在超级终端中输入的数据将回显到超级终端上,结果如图5.4所示:

图5.4  运行结果

(8)  修改程序代码,使用户输入的数字在超级终端显示;结果如图5.5所示:

图5.5  运行结果

图5.6  运行结果

5  实验总结

通过这次实验我掌握了串口的使用方法,串口初始化、发送数据和接收数据,为以后的实验奠定了基础,通过有关书籍我知道在嵌入式系统中串口是一个重要的资源,常用来做输入输出设备。

在实验过程中遇到了很多的问题,在第一次连接开发板的时候,无论怎样连接都无法在超级终端显示,在修改代码使用户输入数字在超级终端显示时,代码重新修改优化也是花费了很多的时间。

相关推荐