南邮嵌入式系统B实验报告.docx
- 文档编号:11944576
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:22
- 大小:408.42KB
南邮嵌入式系统B实验报告.docx
《南邮嵌入式系统B实验报告.docx》由会员分享,可在线阅读,更多相关《南邮嵌入式系统B实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
南邮嵌入式系统B实验报告
南京邮电大学通信学院
实验报告
实验名称:
基于ADS开发环境的程序设计
嵌入式Linux交叉开发环境的建立
嵌入式Linux环境下的程序设计
多线程程序设计
课程名称嵌入式系统B
班级学号
姓名
开课学期2016/2017学年第2学期
实验一基于ADS开发环境的程序设计
一、实验目的
1、学习ADS开发环境的使用;
2、学习和掌握ADS环境下的汇编语言及C语言程序设计;
3、学习和掌握汇编语言及C语言的混合编程方法。
二、实验内容
1、编写和调试汇编语言程序;
2、编写和调试C语言程序;
3、编写和调试汇编语言及C语言的混合程序;
三、实验过程与结果
1、寄存器R0和R1中有两个正整数,求这两个数的最大公约数,结果保存在R3中。
代码1:
使用C内嵌汇编
#include
intfind_gcd(intx,inty)
{
intgcdnum;
__asm
{
MOVr0,x
MOVr1,y
LOOP:
CMPr0,r1
SUBLTr1,r1,r0
SUBGTr0,r0,r1
BNELOOP
MOVr3,r0
MOVgcdnum,r3
//stop
//Bstop
//END
}
returngcdnum;
}
intmain()
{
inta;
a=find_gcd(18,9);
printf("gcdnum:
%d\n",a);
return0;
}
代码2:
使用纯汇编语言
AREAexample1,CODE,readonly
ENTRY
MOVr0,#4
MOVr1,#9
start
CMPr0,r1
SUBLTr1,r1,r0
SUBGTr0,r0,r1
BNEstart
MOVr3,r0
stop
Bstop
END
2、寄存器R0、R1和R2中有三个正整数,求出其中最大的数,并将其保存在R3中。
代码1:
使用纯汇编语言
AREAexamp,CODE,READONLY
ENTRY
MOVR0,#10
MOVR1,#30
MOVR2,#20
Start
CMPR0,R1
BLElbl_a
CMPR0,R2
MOVGTR3,R0
MOVLER3,R2
Blbl_b
lbl_a
CMPR1,R2
MOVGTR3,R1
MOVLER3,R2
lbl_b
B.
END
代码2:
使用C内嵌汇编语言
#include
intfind_maxnum(inta,intb,intc)
{
intx;
__asm
{
MOVr0,a
MOVr1,b
MOVr2,c
CMPr0,r1
BLElbl_a//相等跳转
CMPr0,r2
MOVGTx,r0
MOVLEx,r2
//MOVr3,x
Blbl_b
lbl_a:
CMPr1,r2
MOVGTx,r1
MOVLEx,r2
//MOVr3,x
lbl_b:
}
returnx;
}
intfor_r3(intt)
{
//intt;
__asm
{
MOVr3,t
}
return0;
}
intmain()
{
inta;
a=find_maxnum(130,50,70);
for_r3(a);
printf("max:
%d\r\n",a);
return0;
}
3、编程实现将从地址source开始的30个字节数据复制到地址为dest的地方。
代码:
NUMEQU30
AREAInit,CODE,READONLY
CODE32
ENTRY
START
LDRR0,=SOURCE
LDRR1,=DEST
MOVR2,#NUM
MOVSP,#0X400
BLKCOPY
MOVR3,R2,LSR#3
BEQCOPYWORDS
STMFDSP!
{R4-R11}
OCTCOPY
LDMIAR0!
{R4-R11}
STMIAR1!
{R4-R11}
SUBSR3,R3,#1
BNEOCTCOPY
LDMFDSP!
{R4-R11}
COPYWORDS
ANDSR2,R2,#7
BEQSTOP
WORDCOPY
LDRR3,[R0],#4
STRR3,[R1],#4
SUBSR2,R2,#1
BNEWORDCOPY
STOP
BSTOP
LTORG
SOURCEDCD1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6
DESTDCD0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
END
4、用汇编语言设计实现10!
。
代码:
使用纯汇编语言
AREAFctrl,CODE,READONLY
ENTRY
CODE32
START
MOVR8,#10
MOVR9,#0
SUBR0,R8,#1
Loop
MOVR1,R9
UMULLR8,R9,R0,R8
MLAR9,R1,R0,R9
SUBSR0,R0,#1
BNELoop
StopBStop
END
5、实现字符串的逆序复制TEXT1=”HELLO”=>TEXT2=”OLLEH”。
代码:
使用纯汇编语言
AREAinvstring,CODE,READONLY
ENTRY
ATART
ADRR1,TEXT1
ADRR2,TEXT2
MOVR3,#0
LOOP
LDRBR0,[R1],#1
ADDR3,R3,#1
CMPR0,#0
BNELOOP
SUBR1,R1,#2
LOOP1
LDRBR0,[R1],#-1
STRBR0,[R2],#1
SUBR3,R3,#1
CMPR3,#1
BNELOOP1
MOVR5,#&55
NOP
TEXT1="HELLO",0
ALIGN
TEXT2="OELLH"
END
6、用调用子程序的方法实现1!
+2!
+3!
+…….+10!
代码:
asmp.s
AREAJC,CODE,READONLY
EXPORTJCP
ENTRYJCP
ADDR3,R0,#1
MOVR2,#1
MOVR1,#1
LOOPMULR0,R1,R2
MOVR1,R0
ADDR2,R2,#1
CMPR2,R3
BNELOOP
NOP
NOP
MOVPC,LR
END
PROGC.c
#include
ExternintJCP(intN)
intmain(){
intres=0;
intm=10;
inti;
for(i=1;i<=m;i++)
res=res+JCP(i);
printf(“Theresult=%d\n”,res);
return0;}
四、实验小结
实验二嵌入式Linux交叉开发环境的建立
一、实验目的
1、掌握嵌入式Linux交叉开发环境的建立方法
2、学习和掌握Linux常用命令
3、学习和掌握vi编辑器的使用
二、实验内容
1、搭建嵌入式Linux交叉开发环境
2、熟悉Linux的常用命令
3、熟悉vi编辑器的常用命令
三、实验原理
Linux系统是UNIX系统的分支,是UNIX的微机版。
Linux具有异常丰富的驱动程序资源,支持各种主流的硬件设备与技术。
Linux包含了现代的UNIX操作系统的所有功能特性,这些功能包括多任务、虚拟内存、虚拟文件系统、进程间通信、对称所处理器、多用户支持等。
Vi编辑器是所有UNIX和Linux下的标准编辑器。
它包含3种工作模式。
嵌入式系统是专用的计算机系统,它对系统的功能、可靠性、成本、体积、功耗等有严格的要求。
大部分嵌入式系统没有大容量存储设备,一般不能安装大型开发软件,系统的开发需要采用交叉开发模式。
四、实验过程与结果
实验用的是UP-NetARM2410-S试验箱,里面配有三星的芯片S3c2410X。
打开电脑上VMWare软件,在Windows系统下启动虚拟机里的Linux系统。
接着需要
1.宿主机的环境搭建
下载并运行VMWare,根据向导创建一台新虚拟机并选择Linux作为客户操作系统,再根据向导安装RedHatLinux9.0。
2.虚拟机中启动Linux操作系统
使用root登陆,用户名为root,密码为123456。
之后对共享文件设置进行调整:
打开settings界面,打开sharedfolders功能,同时将路径设置到有课前下载的软件的目录下。
3.开发工具软件的安装
(1)安装gcc
打开Linux后,打开终端窗口,在共享的目录下找到install.sh并运行,命令如下:
ls
./install.sh
安装程序将自动建立/arm2410s目录,并将所有的开发软件包安装到/arm2410s目录下,同时自动配置编译环境,建立合适的符号链接。
安装完成后在目录/opt/host/armv4l/bin/下应该能看到主编译器。
(2)配置PATH路径
vi.bash.profile
将里面PATH变量改为PATH=$PATH:
$HOME/bin:
/opt/host/armv41/bin/;
存盘后执行
source.bash_profile
以后armv4l-unknown-linux-gcc将被自动搜索到
4.宿主机上的开发环境配置
(1)配置IP地址
(2)关闭防火墙
(3)配置NFS。
单击“Red”菜单→“系统设置”→“服务器设置”→“服务”,在“服务配置”窗口中勾选nfs,单击“开始”
(4)NFS设置
单击“Red”菜单→“系统设置”→“服务器设置”→“NFS服务器”,打开“NFS服务器配置”窗口,设置NFS共享。
然后在NFS服务器中增加主机IP地址的链接许可和目录。
完成配置。
5.目标机的信息输出
Windows系统下,“开始”→“所有程序”→“附件”→“通讯”→“超级终端”,新建一个通信终端。
区号、电话号码随意输入。
设置每秒位数为“115200”,数据位为“8”,无奇偶校验,停止位为“1”,无数据流控制。
单击“确定”。
6.程序的运行
打开超级终端,启动Linux,屏幕显示:
[/mnt/yaffs]
在超级终端上执行挂载命令:
[/mnt]mount–tnfs192.168.0.121:
/arm2410s/mnt/nfs
挂载成功后可执行程序。
五、实验小结
实验三嵌入式Linux环境下的程序设计
一、实验目的
1、掌握嵌入式Linux环境下的程序设计方法
2、学会编写Makefile文件
二、实验内容
1、熟悉嵌入式教学实验箱的使用
2、编写C程序和Makefile文件
3、编译程序产生可执行程序
4、完成主机的挂载和程序的执行
三、实验原理
在嵌入式Linux环境下的程序设计方法有一下几个步骤:
1.编写源程序
2.编写Makefile文件
3.编译程序
4.运行和调试程序
5.将生产的可执行文件加入文件系统。
前三个步骤在宿主机上完成,后面的步骤在目标机上完成。
四、实验过程与关键代码分析
1.建立工作目录
mkdirhello
cdhello
2.编写源程序
用vi编辑器编辑Hello.c文件
viHello.c
在Vi中输入源程序如下:
#include
main()
{
printf(“helloB14011221\n”);//学号
}
3.编写Makefile文件
viMakefile
在vi中编辑Makefile文件如下:
CC=armv4l-unknown-linux-gcc
EXEC=hello
OBJS=hello.o
CFLAGS+=
LDFLAGS+=-static
all:
$(EXEC)
$(EXEC):
(OBJS)
$(CC)$(LDFLAGS)–o$@$(OBJS)
clean:
-rm–f$(EXEC)*.elf*.gdb*.o
4.编译程序
在hello目录下运行“make”来编译程序。
makeclean
make
编译成功后,生成可执行文件Hello.o。
5.下载调试
在宿主机上启动nfs服务,并将/arms2410s设置为共享目录。
接下来启动超级终端,建立通讯,挂载。
挂载命令:
执行目录下的hello程序,显示如图:
五、实验小结
实验四多线程程序设计
一、实验目的
1、了解多线程程序设计的基本原理
2、学习Linux多任务管理程序的开发
3、学习pthread常用库函数的使用
二、实验内容
1、编写多线程程序和Makefile文件
2、编译程序产生可执行程序
3、完成主机的挂载和程序的执行
三、实验原理
(1)pthread_create:
创建线程函数
头文件:
#include
函数原型:
intpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);
获得父进程ID:
pthread_self
头文件:
#include
函数原型:
pthread_tpthread_self(void);
测试两个线程号是否相同:
pthread_equal
头文件:
#include
函数原型:
intpthread_equal(pthread_tthread1,pthread_tthread2);
(2)pthread_join:
使一个线程等待另一个线程结束
头文件:
#include
函数定义:
intpthread_join(pthread_tthread,void**retval);
描述:
pthread_join()函数,以阻塞的方式等待thread指定的线程结束。
当函数返回时,被等待线程的资源被收回。
如果线程已经结束,那么该函数会立即返回。
并且thread指定的线程必须是joinable的。
参数:
thread:
线程标识符,即线程ID,标识唯一线程。
retval:
用户定义的指针,用来存储被等待线程的返回值。
返回值:
0代表成功。
失败,返回的则是错误号。
(3)线程创建函数:
pthread_t:
线程句柄
类型定义:
typedefunsignedlongintpthread_t;
用途:
pthread_t用于声明线程ID。
sizeof(pthread_t)=8
pthread_t,在使用printf打印时,应转换为u类型。
四、实验过程与关键代码分析
实验代码:
#include
#include
#include
#include"pthread.h"
/*-Thread1-------------------------------------*/
voidthread1()
{
inti=0;
while
(1)
{printf("thread1:
%d\n",i);
if(i>3)
pthread_exit(0);
i++;
sleep
(1);
}
}
/*--Thread2-----------------------------*/
voidthread2()
{inti=0;
while
(1)
{printf("thread2:
%d\n",i);
if(i>5)
pthread_exit(0);
i++;
sleep
(1);
}
}
/*--------------------------------------------------------*/
intmain(void)
{
pthread_tt1,t2;
pthread_create(&t1,NULL,(void*)thread1,NULL);
pthread_create(&t2,NULL,(void*)thread2,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return0;
}
实验结果:
实验问题:
一开始编译的时候出错,提示pthread_create未定义。
网上查询原因以后得知:
pthread库不是linux系统默认的库,连接时需要使用静态libpthread.a,因此在编译时要加–lpthread参数,问题解决。
五、实验小结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)