下载此文档

ARM实验报告.pdf


文档分类:高等教育 | 页数:约17页 举报非法文档有奖
1/17
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/17 下载此文档
文档列表 文档介绍
该【ARM实验报告 】是由【mama1】上传分享,文档一共【17】页,该文档可以免费在线阅读,需要了解更多关于【ARM实验报告 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
南京邮电大学通达学院
嵌入式系统B
实验报告
班级100023
专业通信工程(嵌入式系统开发)
学号10002304
陆海霞
实验项目:
1、ADS下简单ARM汇编程序:.
.--
2、熟悉LINUX开发环境
3、多线程应用程序设计
指导教师山岗
实验一ADS下简单ARM汇编程序
实验目的:
1、;
2、熟悉在ADS中创建工程及编写、编译和运行汇编语言程序的方法;
3、熟悉AXD中各种调试功能。
实验环境:
1、硬件:PC机。
2、。
实验容:
1、在ADS中新建工程,并设置开发环境。
2、在CodeWarrior环境中编辑、编译和汇编语言程序,并生成可执行文件。
3、在AXD中调试汇编程序;
4、使用命令行界面编辑、编译和汇编程序。
实验步骤:
本实验要求在ADS环境下,编写一个汇编程序,计算S=1+2+3……+n的累加值。
把累加结果S存入到存储器的指定位置;在AXD中调试该程序,使用ARMulator模拟目标机。
1、新建工程。
打开CodeWarrior,选择File->New(project)选项,使用ARMExecutableImage模版新建一个工
程。
2、设置编译和选项。
由于我们使用的是模拟机,设置汇编语言编译器的模拟处理器架构为Xscale;在ARMLinker
中,选择output选项卡并选择Linktype为Simple类型,确认ROBase为0x8000,修改RWBase
为0x9000,
3、为当前工程添加源程序文件。
ARM汇编程序源文件后缀名为S大小写均可。
.可修编:.
.--
确保添加入当前工程复选框选上。
4、编辑源程序代码。
:
;armadd源程序
NEQU7;累加次数
;定义名为Adding的代码段
AREAAdding,CODE,READONLY
ENTRY
MOVR0,#0
MOVR1,#1
REPEATADDR0,R0,R1
ADDR1,R1,#1
CMPR1,#N
BLEREPEAT
LDRR2,=RESULT
STRR0,[R2]
HEREBHERE
定义名为Dataspace的数据段
AREADataspace,DATA,READWRITE
RESULTDCD0
END
实验中程序编写如下图所示:
5、编译汇编源代码文件。
,选择pile,如果没有成功会弹出错误和警告窗口。

:
.可修编:.
.--
6、编译整个工程。
选择ProjectMake进行整个工程的编译。。
7、确认调试目标设置。
设置目标处理器型号。
8、运行映像文件。
9、调试准备
在AXD中,打开各个观察窗口,做调试准备。选择ProcessorViewsRegisters选项,打开
ARM寄存器显示窗口。调整窗口大小,使得Corrent节点的R0~R2寄存器可见。选择Processor
ViewsMemory选项,打开ARM存储器显示窗口。在StartAddress输入框中输入准备查看
的存区域首地址0x9000。
10、调试映像文件。
打开调试窗口。
为了便于调试,观察各个寄存器和存储器的变化情况。
11、单步运行程序,观察并记录结果。
在AXD中,选择ExecuteStep选项,或者F10键,单步运行程序,查看相关寄存器和存储
器相应地址上的变化,请把每一步的结果填入下表中。
运行结果如图所示:
分析源程序可以看出,我们的程序仅对少数几个寄存器进行了读写操作。
序号执行指执行后的变化情况
令寄存器(十六进制)存储器(十六进制)
R0R1R2PC0x9000
.可修编:.
.--
1MOV0x000000000x000000000x000000000x000080040x9000
R0,#0
2MOV0x000000000x000000010x000000000x000080080x9010
R1,#1
3ADD0x000000010x000000010x000000000x0000800c0x9020
R0,R0,
R1
4ADD0x000000010x000000020x000000000x000080100x9030
R1,R1,
#1
5CMP0x000000010x000000020x000000000x000080140x9040
R1,#N
6BLE0x000000010x000000020x000000000x000080080x9050
REPEA
T
7ADD0x000000030x000000020x000000000x0000800c0x9060
R0,R0,
R1
注意:如果错过记录的时机可以选择FileReloadCurrentImage重新加载映像文件。
实验思考:
1、有没有办法让AXD中寄存器和存储器单元的值直接显示为十进制?
答:暂停ads,修改相关参数,即可显示
同组同学:
10002201郡遥
10002304陆海霞
10002302祁蕾
10002308梁玉
实验二熟悉LINUX开发环境
实验目的:
.可修编:.
.--
熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。使用Linux的
armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本
过程。
实验环境:
硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上。
软件:+MINI+ARM-LINUX开发环境
实验容:
1、,安装ARM-Linux的开发库及编译器。
2、创建一个新目录,。学****在Linux下的编程和编译过
程。
3、ARM开发板的使用和开发环境的设置。
4、下载已经编译好的文件到目标开发板上运行。
实验步骤:
1、嵌入式交叉开发环境的建立
1)宿主机的环境搭建
选择一种方式在宿主机上直接安装Linux操作系统,如安装RedHat.
下载VMWare,解压后根据提示正确安装VMWare到硬盘中;
运行VMWare,根据向导创建一台虚拟机并选择Linux作为客户操作系统;

2)虚拟机中启动Linux操作系统
用户名:root密码:12345678
将Windows下的e盘设为共享目录,则在Linux的/mnt/hgfs/目录下就可以访问到Windows
下的e盘了。
3)开发工具软件的安装
1、安装gcc
在Linux主窗口中单击鼠标右键,选择“新建终端”命令,打开Linux命令行窗口。在目录
/mnt/hgfs/e/-tools/。操作命令如下:
[]#ls
[]#./
2、配置PATH路径
/root/下有一个“.bash_Profile”文件(因为该文件是隐藏文件,所以需要用“ls-a”命令才
能显示);
用vi编辑器编辑该文件:
[]#
将文件中PATH变量改为PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;
存盘后执行
[]#
.可修编:.
.--
以后armv41-unknown-linux-gcc将会被自动搜索到。
4)宿主机上的开发环境配置
1、配置IP地址
,,具体配置时
间方法如下:
[]#
在Linux中选择“Red”菜单—>“系统设置”->“网络”,打开“网络配置”窗口,双击设
备eth0的蓝色区域,进入以太网设置界面。
2、关闭防火墙
单击“Red”菜单—>“系统设置”—>安全级别,打开“安全级别配置”窗口,选择“无防
火墙”选项。
3、配置NFS
单击“Red”菜单->系统设置->服务器设置->服务,在“服务配置”窗口中勾选nfs,单击“开
始”
4、NFS设置
单击“Red”菜单->系统设置->服务器设置->NFS服务器,打开“NFS服务器配置”窗口,
设置NFS共享。单击增加,在“目录”文本框中填入需要共享的路径,在主机文本框中填
入允许进行连接的主机IP地址。选择允许客户对共享目录的操作为只读或读写。最后退出
时则完成NFS配置。配置好后,界面应显示如下图所示:
至此,交叉开发环境的主机部分配置完成。
5)目标机的信息输出
使用超级终端介绍宿主机与实验箱的通信。
首先连接串口线:一端连接PC的串口(1),另一端连接到UP-NETARM2410-S实验箱的串
口。接下来建立超级终端:运行Windows系统下的“开始”-“所有程序”-“附件”-“通
讯”-“超级终端”,新建一个通信终端。
.可修编:.
.--
6)程序的运行
打开超级终端,打开实验箱电源开关,系统会由vivi开始引导。正常显示时会显示启动信息
到“PressReturntostarttheLINUXnow,anyotherkeyforvivi”,如果不进行任何操作等待30s
或按回车键则启动进入Linux系统;如果按回车键以外的其他键则进入vivi控制台。在这里
输入boot,会引导Kernel启动Linux系统。Linux系统启动完成后,屏幕显示:[/mnt/yaffs]
基于Linux的应用程序的开发步骤
1、建立工作目录
[rootzxtsmile]#mkdirhello
[rootzxtsmile]#cdhello
2、编写程序源代码
.可修编:.
.--
在Linux下的文本编辑器有许多,常用的是vim和Xwindow界面下的gedit等,我们在开
发过程中推荐使用vim,用户需要学****vim的操作方法,请参考相关书籍中的关于vim的
操作指南。Kdevelope、,使用它们对于熟悉windows
环境下开发的用户更容易上手。
,如下:
#include<>
main()
{
printf(“helloworld\n”);
}
,进入hello目录使用vi命令来编辑代
码:
[rootzxthello]#
按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,

用命令“:wq”保存并退出。。
3、编写Makefile
,我们必须要编写一个Makefile文件,Makefile文件
定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要
重新编译等等更为复杂的命令。使用它带来的好处就是自动编译,你只需要敲一个“make”
命令整个工程就可以实现自动编译,当然我们本次实验只有一个文件,它还不能体现出使
用Makefile的优越性,但当工程比较大文件比较多时,不使用Makefile几乎是不可能的。
下面我们介绍本次实验用到的Makefile文件。
CC=armv4l-unknown-linux-gcc
EXEC=hello
OBJS=
CFLAGS+=
LDFLAGS+=–static
all:$(EXEC)
$(EXEC):$(OBJS)
$(CC)$(LDFLAGS)-o$$(OBJS)
clean:
-rm-f$(EXEC)*.elf*.gdb*.o
下面我们来简单介绍这个Makefile文件的几个主要部分:
CC指明编译器
EXEC表示编译后生成的执行文件名称
OBJS目标文件列表
CFLAGS编译参数
LDFLAGS连接参数
all:编译主入口
.可修编:.
.--
clean:清除编译结果
,用vi来创建一个Makefile文件并将代码录入其中
[rootzxthello]#viMakefile
4、编译应用程序
在上面的步骤完成后,我们就可以在hello目录下运行“make”来编译我们的程序了。如果
进行了修改,重新编译则运行:
[rootzxthello]#makeclean
[rootzxthello]#make
5、下载调试
在宿主PC计算机上启动NFS服务,并设置好共享的目录,具体配置请参照前面第一章第

节中关于嵌入式Linux环境开发环境的建立。在建立好NFS共享目录以后,我们就可以进
入MINI中建立开发板与宿主PC机之间的通讯了。
[rootzxthello]#mini
[/mnt/yaffs]mount-tnfs-:/arm2410s/host
如果不想使用我们提供的源码的话,可以再建立一个NFS共享文件夹。如/root/share,我
们把我们自己编译生成的可执行文件复制到该文件夹下,并通过MINI挂载到开发板上。
[rootzxthello]#cphello/root/share
[rootzxthello]#mini
[/mnt/yaffs]mount-tnfs-:/root/share/host
再进入/host目录运行刚刚编译好的hello程序,查看运行结果。
[/mnt/yaffs]cd/host
[/host]./hello
helloworld
实验思考:
?其中的宏定义分别是什么意思?
答:解释makefile如何工作:makefile是一个文本文件,用于描述程序源代码之间以及程序
可执行代码与源代码之间的依赖关系。
简单例子:,那么make文
件就要写两行:
:
-
第一行描述了依赖关系,第二行描述了依赖关系是如何达成的。
更复杂的例子:,
,那么要写好多行:
:
-
:
gcc--
这就是makefile的工作方法。
.可修编:.
.--
关于宏定义,简单点说就是文本替换。为了方便使用不同的编译器或者编译环境以及硬件环
境,一些复杂的软件使用了大量的宏定义来代替诸如“gcc”。
同组同学:
10002201郡遥
10002304陆海霞
10002302祁蕾
10002308梁玉
实验三多线程应用程序设计
实验目的:
了解多线程程序设计的基本原理。
学****pthread库函数的使用。
实验环境:
硬件:UP-NETARM2410-S嵌入式实验平台,PC机Pentium500以上,硬盘40G以上,存大
于128M。
软件:+MINI+ARM-LINUX开发环境
实验容:
,熟悉几个重要的PTHREAD库函数的使用。掌握共享锁和信号量
的使用方法。
进入/arm2410s/exp/basic/02_pthread目录,运行make产生pthread程序,使用NFS方
式连接开发主机进行运行实验。
实验步骤:

本实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者
线程。生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程
不断地从共享的循环缓冲区读取数据。流程图如下图所示:
.可修编:.
.--
退出
本实验具体代码如下:
#include<>
#include<>
#include<>
#include""
#defineBUFFER_SIZE16
/*设置一个整数的圆形缓冲区*/
structprodcons{
intbuffer[BUFFER_SIZE];/*缓冲区数组*/
pthread_mutex_tlock;/*互斥锁*/
intreadpos,writepos;/*读写的位置*/
pthread_cond_tnotempty;/*缓冲区非空信号*/
pthread_cond_tnotfull;/*缓冲区非满信号*/
};
/*初始化缓冲区*/
voidinit(structprodcons*b)
{
pthread_mutex_init(&b->lock,NULL);
pthread_cond_init(&b->notempty,NULL);
pthread_cond_init(&b->notfull,NULL);
b->readpos=0;
.可修编:.
.--
b->writepos=0;
}
/*向缓冲区中写入一个整数*/
voidput(structprodcons*b,intdata)
{
pthread_mutex_lock(&b->lock);
/*等待缓冲区非满*/
while((b->writepos+1)%BUFFER_SIZE==b->readpos){
printf("waitfornotfull\n");
pthread_cond_wait(&b->notfull,&b->lock);
}
/*写数据并且指针前移*/
b->buffer[b->writepos]=data;
b->writepos++;
if(b->writepos>=BUFFER_SIZE)b->writepos=0;
/*设置缓冲区非空信号*/
pthread_cond_signal(&b->notempty);
pthread_mutex_unlock(&b->lock);
}
/*从缓冲区中读出一个整数*/
intget(structprodcons*b)
{
intdata;
pthread_mutex_lock(&b->lock);
/*等待缓冲区非空*/
while(b->writepos==b->readpos){
printf("waitfornotempty\n");
pthread_cond_wait(&b->notempty,&b->lock);
}
/*读数据并且指针前移*/
data=b->buffer[b->readpos];
b->readpos++;
if(b->readpos>=BUFFER_SIZE)b->readpos=0;
/*设置缓冲区非满信号*/
pthread_cond_signal(&b->notfull);
pthread_mutex_unlock(&b->lock);
returndata;
}
#defineOVER(-1)
structprodconsbuffer;
/*--------------------------------------------------------*/
void*producer(void*data)
{
intn;
.可修编:.
.--
for(n=0;n<1000;n++){
printf("put-->%d\n",n);
put(&buffer,n);
}
put(&buffer,OVER);
printf("producerstopped!\n");
returnNULL;
}
/*--------------------------------------------------------*/
void*consumer(void*data)
{
intd;
while(1){
d=get(&buffer);
if(d==OVER)break;
printf("%d-->get\n",d);
}
printf("consumerstopped!\n");
returnNULL;
}
/*--------------------------------------------------------*/
intmain(void)
{
pthread_tth_a,th_b;
void*retval;
init(&buffer);
pthread_create(&th_a,NULL,producer,0);
pthread_create(&th_b,NULL,consumer,0);
/*等待生产者和消费者结束*/
pthread_join(th_a,&retval);
pthread_join(th_b,&retval);
return0;
}
:
下面我们来看一下,生产者写入缓冲区和消费者从缓冲区读数的具体流程,生产者首先要
获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件
变量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后
释放互斥锁。消费者线程与生产者线程类似,这里就不再过多介绍了。流程图如下:
.可修编:.
.--
生产者写入共享的循环缓冲区函数PUT
voidput(structprodcons*b,intdata)
{
pthread_mutex_lock(&b->lock);//获取互斥锁
while((b->writepos+1)%BUFFER_SIZE==b->readpos){
//如果读写位置相同
pthread_cond_wait(&b->notfull,&b->lock);
//等待状态变量b->notfull,不满则跳出阻塞
}
b->buffer[b->writepos]=data;//写入数据
b->writepos++;
if(b->writepos>=BUFFER_SIZE)b->writepos=0;
pthread_cond_signal(&b->notempty);//设置状态变量
pthread_mutex_unlock(&b->lock);//释放互斥锁
}
消费者读取共享的循环缓冲区函数GET
intget(structprodcons*b)
{
intdata;
pthread_mutex_lock(&b->lock);//获取互斥锁
while(b->writepos==b->readpos){//如果读写位置相同
pthread_cond_wait(&b->notempty,&b->lock);
.可修编:.
.--
//等待状态变量b->notempty,不空则跳出阻塞。否则无数据可读。
}
data=b->buffer[b->readpos];//读取数据
b->readpos++;
if(b->readpos>=BUFFER_SIZE)b->readpos=0;
pthread_cond_signal(&b->notfull);//设置状态变量
pthread_mutex_unlock(&b->lock);//释放互斥锁
returndata;
}
1、阅读源代码及编译应用程序
进入exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码。运行make
产生pthread可执行文件。
2、下载和调试
切换到mini终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。后一部分结果
如下:
waitfornotempty
put-->994
put-->995
put-->996
put-->997
put-->998
put-->999
producerstopped!
993-->get
994-->get
995-->get
996-->get
997-->get
998-->get
999-->get
.可修编:.
.--
consumerstopped!
[/host/exp/basic/02_pthread]
实验思考:
,并在按键为ESC时终止所有线程。
答:

,判断为ESC时,发送终止信号给所有的线程ID

每个线程都具有各自的优先级,线程的优先级可以在程序中表明该线程的重要性,如果有很
多线程处于就绪状态,系统会根据优先级来决定首先使哪个线程进入运行状态。但这个并不
意味着低优先级的线程得不到运行,而只是它运行的几率比较小。
同组同学:
10002201郡遥
10002304陆海霞
10002302祁蕾
10002308梁玉
.可修编

ARM实验报告 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数17
  • 收藏数0 收藏
  • 顶次数0
  • 上传人mama1
  • 文件大小683 KB
  • 时间2023-03-13