第一篇:嵌入式linux基本操作实验一的实验报告
实验一linux基本操作实验的实验报告
一实验目的
1、熟悉嵌入式开发平台部件,了解宿主机/目标机开发模式;
2、熟悉和掌握常用Linux的命令和工具。
二实验步骤
1、连接主机和目标板;(三根线,网线直接连接实验箱和PC机,实验箱UART2连接主机的UART口)。
2、Linux命令的熟悉与操作
PC端:在PC机的桌面上打开虚拟机,并启动Linux系统,打开命令终端,操作Linux基本命令,如:查看:ls,进入目录:cd,创建文件:mkdir,删除文件:rmdir,配置网络:ifconfig,挂载:mount,设置权限:chmod,编辑器:vi,拷贝:cp等命令,要求能熟练操作。
使用方法: 1.查看:ls Ls列出文件和目录
Ls–a
显示隐藏文件
Ls–l
显示长列格式ls–al 其中:蓝:目录;绿:可执行文件;红:压缩文件;浅蓝:链接文件;灰:其他文件;红底白字:错误的链接文件
2.进入目录:cd 改变当前目录:cd 目录名(进入用户home目录:cd ~;进入上一级目录:cd-)3.创建文件:mkdir 建立文件/目录:touch 文件名/mkdir目录名 4.删除文件:rmdir 删除空目录:rmdir目录名 5.配置网络:ifconfig 网络确定目录 '/ mnt/hda2' 已经存在
umount /dev/hda2 卸载一个叫做hda2的盘使用 “+” 设置权限,使用 “-” 用于取消 ls-lh显示权限
ls /tmp | pr-T5-W$COLUMNS 将终端划分成5栏显示
chmodugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r)、写(w)和执行(x)的权限
chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限 chown user1 file1 改变一个文件的所有人属性
chown-R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性
chgrp group1 file1 改变文件的群组
chown user1:group1 file1 改变一个文件的所有人和群组属性 find /-perm-u+s罗列一个系统中所有使用了SUID控制的文件
chmodu+s /bin/file1 设置一个二进制文件的 SUID 位类似SUID,不过这是针对目录的
chmod g-s /home/public 禁用一个目录的 SGID 位
chmodo+t /home/public 设置一个文件的 STIKY 位-只允许合法所有人删除文件
chmod o-t /home/public 禁用一个目录的 STIKY 位 8.编辑器:vi vi开发步骤:
a)vi hell.sql(文件名)b)按i
[进入插入模式] c)按 esc
[进入命令模式] d)输入qw
[表示退出保存] e)输入 q![表示退出不保存] f)输入ls/ls–l
[查看] g)gcc-o my1 hello.sql [-o my1 代表输出按my1 名] w表示与入的意思,也就将目前的文件内容加以保存, q表示退出的意思,也是vi的执行 q!强制离开,并且不保存文件
wq将修改过得内容保存,并离开vi set nu 在文件中每行加入行号 ser noun 取消行号
输入数字若输入数字再按ESC建就可将光标移至改行
/字符串在很长的文件在可以利用”/字符串”的命令来查找特定字 例如“tcp”如果不是所需要的可以按N继续往下查找
?字符串可以利用”?字符串”的命令查找特定字
例如”:/tcp”如果不是所需要的可以按N继续往下查找 9.拷贝:cp等命令
cp–r dir1 dir2 递归复制命令(复制子目录信息)具体操作:打开虚拟机,随意选择一个linux版本,打开命令终端。输入以上命令,观察结果,熟悉指令操作。
图2-1指令熟悉截图
3、打开PC桌面的超级终端,开启实验箱电源,观察嵌入式开发平台的启动过程的打印信息,等待嵌入式平台的操作系统启动后,在超级终端输入步骤2的相关命令。
4、下面所有的操作必须以命令形式。
1)在虚拟机中安装的Linux系统上建立以自己学号命名的文件夹,用vi命令新建以学号命名的文件,熟悉如何编辑源程序代码,随意输入代码并保存退出。
图2-2编辑源程序代码截图
图2-3建立文件夹截图
2)从PC机中复制一个嵌入式平台的可执行文件到该文件夹下(也可以用
vi命令新建一个C语言的文件,之后用arm-linux-gccxxx.c–o xtu得到嵌入式平台可以运行的xtu文件),并修改其名称为xtu。
图2-4建立xtu文件截图
3把xtu文件通过cp命令复制到/tftpboot目录下,设置好开发板的ip。
图2-5 Ip设置截图
设置好PC中Linux的ip,在嵌入式平台通过串口输入tftp命令从PC上的
Linux下载xtu文件到嵌入式开发实验箱平台中,在嵌入式平台上用chmod 777 xtu更改文件权限为可执行权限,运行xtu程序,并查看运行结果。
图2-6 下载文件截图
图2-7下载文件截图
三实验思考
1、比较Linux命令与DOS命令的异同。
Linux是免费的系统,与windows相比具有可靠、稳定、速度快等优点,且拥有丰富的根据Linux版本改进的强大功能。启动: 作为操作系统本身,Linux在启动和退出时所作的工作要比DOS多得多,可以通过按下Ctrl+Alt+Del三键进行热启动。不同的是Linux启动到最后时,需要进行登录。下面是一个典型的登录过程:
„„RedHat Linux release 5.1
Kernel 2.0.32 on an i686
login: 你键入:root
[root@localhost root]#_ 常用命令:
2、注意理解宿主机/目标机开发模式,PC机是宿主机,嵌入式平台是目标机,未来的开发工作是在PC机中开发,目标机中运行并验证。
交叉开发环境是指编译、链接和调试嵌入式应用软件的环境,它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式。宿主机(host)一般采用一台通用计算机(如PC机或者工作站),它通过串口(Serial)或者以太网(Ethernet)接口与目标机通信。宿主机的软硬件资源比较丰富,不但包括功能强大的操作系统(如 Windows 和 Linux),而且还有各种各样优秀的开发工具(如WindRiver的Tornado、Microsoft的Embedded Visual C++等),能够大大
提高嵌入式应用软件的开发速度和效率。目标机(target)一般在嵌入式应用软件的开发和调试期间使用,用来区别与嵌入式系统通信的宿主机。目标机可以是嵌入式应用软件的实际运行环境,也可以是能够替代实际运行环境的仿真系统,但软硬件资源通常都比较有限。嵌入式系统的交叉开发环境一般包括交叉编译器、交叉调试器和系统仿真器(Emulator),其中交叉编译器用于在宿主机上生成能在目标机上运行的代码,而交叉调试器和系统仿真器则用于在宿主机与目标机间完成嵌入式软件的调试。
四实验心得
通过本次实验了解了linux的基本命令,如:ls,cd,mkdir,rmdir,ifconfig,mount,chmod,vi,cp等等,特别是ls,cd,vi等命令比较重要,在以后的实验中会经常用到。熟悉了嵌入式开发平台部件,了解宿主机/目标机开发模式。
在嵌入式试验中使用linux系统是第一次用,一开始对linux系统的命令以和工具的操作都很陌生,只会部分命令的操作,操作起来非常慢。在实验中一个整体的流程也不是很熟悉,过程中遇到的很多小问题都不会解决。浪费了很多时间在实验操作上,同时实验室的机器有部分的坏的,导致做到后边无法继续完成,只能换机器。但是最后在助教和同学的帮助下,我还是完成了这个实验。在这个过程中,我觉得个人的态度很重要,不管我们以前有没有接触过这个知识,我们都应该抱着一颗积极的心去了解它、学习它,不能因为它陌生就排斥。并且在做实验时,不管遇到什么问题以及困难,我们都应该要有耐心,心平气和的去请教别人,直到搞懂所有问题。尤其做到后边遇到问题不要心急,把整个流程一步步的搞懂,再操作起来就会容易些。
第二篇:嵌入式linu学习心得
嵌入式Linux学习心得
1、Linux命令
ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录
cd:改变当前操作目录cd /直接跳到根目录 cd..回到上一级目录 cat: 打印显示当前文件的内容信息
mkdir:创建目录
fdisk: 查看硬盘分区信息,-l以列表方式查看
->代表是链接文件,类似window下的快捷方式。
cp: 复制命令,例子cp 文件名 /home/dir/
mv: 移动或改名,如mv sonf.confsonf.txt(改名)移动:mv sonf.conf / rm:删除命令,如rm –f test.c;如删除目录rm –fr d
man:查看某个命令的帮助,man 命令
2、各系统目录的功能
drw—r—w--:d代表是目录,drw代表当前用户的权限,r代表组用户的权限,w代表其它用户的权限。x代表有执行权限。
/boot/gruff.conf: 启动引导程序
/dev:brw—rw--:b代表是块设备。Linux设备有三种,块设备(b开头)、字符设备(c开头)、网络设备。had代表第一个硬盘,hdb代表第二个硬盘。Hdb2代表第二块硬盘的第二个分区。3,67代表主设备为3,从设备为67./etc:存放的是系统的配置文件。Inittab文件存放不同启动方式下必须启动的进程。Inittab文件中有6个启动level,wait中对应着6个level的目录,respawn代表当一个进程被意外终止了,但会自动启动的进程,如守护进程。rc.d目录中存放了一个rc.sysinit文件,里面存放系统初始化配置信息。/etc还有一个vsftpd里面存放tcp、ftp的配置。
/home : 用户目录,存放用户的文件,/lib:存放库文件,后缀为so的文件代表动态链接库。
/lost+found:系统意外终止,存放一些可以找回的文件。
/mnt:挂载外部设备,如挂载光驱:mount –t /dev/cdrom/mnt/cdrom,如
果在双系统中,要查看windows中D盘的文件,首先应该将D盘的文件映射过来,mount –t /dev/hda2/mnt/windows/d
/opt:用户安装的应用程序
/proc:是系统运行的映射,比较重要。里面的文件数字代表进程号。每个进程号目录下包含进程的基本信息。还有其他信息,如cpuinfo等,内核支持的文件系统filesystem等。系统支持的中断interrupts,iomen代表内存分配情况。ioport存放IO端口号。还有分区信息,modole信息,状态信息,版本信息
对于Linux的设备驱动程序,有两种加载模式,一种是直接加载进linux内核,一种是以模块的方式加载到内核。
/sbin: 系统管理的一些工具。如poweroff关机工具。
/usr: 安装系统时很多文件放在此目录下面,包含一些更新等,include包含的头文件,lib 是Linux的库文件,src包含Linux2.4的内核源码
/var:存放是临时变量
3、
第三篇:实验一 实验报告
网 络 程 序 设 实验报告
实验名称:Winsock编程接口实验 实验类型: 验 证 型
计
一、实验目的
掌握Winsock的启动和初始化;
掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
二、实验设计
实验内容:
1、编写程序能同时实现对多个域名的解析。比如在控制台输入:getip www.xiexiebang.com对应的IP地址列表。
2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址。
根据实验内容编写程序:
1、对相关域名进行解析,利用gethostbyname()完成解析,用到的结构体为:
struct hostent{ char FAR*
h_name;char FAR* FAR* h_aliases;short
h_addrtype;short
h_length;char FAR* FAR* h_addr_list;}
得到的IP地址列表由h_addr_list存储;
2、利用GetAdaptersInfo()函数获得本地主机的相关信息,通过IP_ADAPTER_INFO结构体返回所需信息。
IP_ADAPTER_INFO的定义如下: typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next;
DWORD ComboIndex;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD Index;
UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
三、实验过程(包含实验结果)
1、分析题目,编写程序;
2、将编写的程序进行编译、运行,输入题目给定的内容,完成题目要求; 结果如下:
第1题:
第2题:
四、讨论与分析
思考题:
1、Winsock初始化的作用:只有调用了WSAStartup()进行初始化之后,应用程 序才能调用其他Windows Sockets API函数,实现网络通信;
2、函数原型为:
DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo,//接受数据的缓冲区
PULONG pOutBufLen
// 数据的长度大小);
3、域名解析时出现域名对应多个IP,原因:该域名存在于多个服务器。
五、实验者自评
通过本次实验,我掌握了Winsock的启动和初始化以及gethostname(),gethostbyname(),GetAdaptersInfo()等函数查询的使用,加深了以前对课本知识的认识程度。
六、附录:关键代码(给出适当注释,可读性高)
第1题代码:
////////////////////////////////////////////////// // GetAllIps.cpp文件
//#include “../common/InitSock.h” #include
using namespace std;
#pragma comment(lib, “WS2_32”)// 链接到WS2_32.lib //CInitSock initSock;// 初始化Winsock库
void main(){
char szMessage[256];// 取得本地主机名称
// 初始化
WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2), &wsaData)!= 0){
exit(0);}
// 通过主机名得到地址信息
printf(“ Get IP::”);gets(szMessage);
// 获取主机信息
hostent *pHost = ::gethostbyname(szMessage);
// 打印出所有IP地址
in_addr addr;for(int i = 0;;i++){
char *p = pHost->h_addr_list[i];
if(p == NULL)
break;
memcpy(&addr.S_un.S_addr, p, pHost->h_length);
char *szIp = ::inet_ntoa(addr);
printf(“ 服务器 %s IP地址:%s n ”,szMessage, szIp);
printf(“服务器名字: %s n”,pHost->h_name);}
/////////////////////////// ::WSACleanup();
}
第2题代码:
// 获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址
#include
void main(){ // 定义变量
IP_ADAPTER_INFO *pAdapterInfo;ULONG ulOutBufLen;DWORD dwRetVal;PIP_ADAPTER_INFO pAdapter;
pAdapterInfo =(IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));ulOutBufLen = sizeof(IP_ADAPTER_INFO);// 第一次获取适配器信息,得到ulOutBufLen的实际大小
if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)!= ERROR_SUCCESS){
free(pAdapterInfo);
pAdapterInfo =(IP_ADAPTER_INFO *)malloc(ulOutBufLen);} // 第二次获取适配器信息,获得了pAdapterInfo信息
if(dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)!= ERROR_SUCCESS){
cout<<“GetAdapterInfo Error!”< // 打印MAC地址信息、子网掩码以及网关 pAdapter = pAdapterInfo;while(pAdapter){ cout<<“MAC Address: ”; for(int i=0;i AddressLength;i++) { if(i ==(pAdapter->AddressLength-1)) { cout< } else { cout< } } cout< cout<<“IP 地址:”< IpAddressList.IpAddress.String< cout<<“子网掩码 :”< IpAddressList.IpMask.String< cout<<“网关 :”< IpAddressList.IpAddress.String< cout<<“****************************************”< pAdapter = pAdapter->Next;} // 释放资源 if(pAdapterInfo){ free(pAdapterInfo);} cout< } 实验一 ARM汇编语言程序设计 一、实验目的 1.了解IAR Embedded Workbench 集成开发环境 2.掌握ARM汇编指令程序的设计及调试 二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADSI.2集成开发环境,仿真驱动程序 三、实验内容 1.熟悉IAR Embedded Workbench 集成开发环境 2.理解下列程序,新建工程,加入下面的程序,并观察实验结果,解释程序实现的功能 分析:该程序实现的功能是程序功能:Y = A*B+C*D+E*F 程序代码: AREA Examl, CODE,READONLY;定义一个代码段 ENTRY ;程序入口 MOV R0,#0;设置R0寄存器的值为0 MOV R8,#0;设置R8寄存器的值为0 ADR R2,N;将R2寄存器的值设为数据域N的地址 LDR R1,[R2];将以R2的值为地址的数据读入R1 MOV R2,#0;设置R2的值为0 ADR R3,C;将R3寄存器的值设为数据域C的地址 ADR R5,X;将R5寄存器的值设为数据域X的地址 LOOP LDR R4,[R3,R8];将R3+R8的数据读入R4 LDR R6,[R5,R8];将R5+R8的数据读入R6 MUL R9,R4,R6;R9 = R4*R6 ADD R2,R2,R9;R2 = R2+R9 ADD R8,R8,#4;R8 = R8+4 ADD R0,R0,#1;R0 = R0+1 CMP R0,R1;比较R0和R1的值 BLT LOOP;R0 执行结果如下: 3.实现1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面 程序代码: MOV R0,#100;设置R0寄存器的值为100 LDR R2,=0X90018;设置R2寄存器指向地址0x90018 MOV R1,#0;设置R1的值为0 MOV R3,#0;设置R3的值为0 LOOP ADD R3,R3,R0;R3 = R3+R0 SUB R0,R0,#1;R0 = R0-1 CMP R0,R1;将R0和R1的值比较 BNE LOOP;不相等的话继续执行循环 STR R3,[R2];将R3的值装入到R2指向的地址块中。END 程序执行结果:程序执行完在0x90018内存入的数据是0x13ba即5050 实验二 ARM汇编语言程序设计 一、实验目的 1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程; 2.掌握ARM汇编指令中的堆栈指令的操作,以及存储器的装载指令操作。 二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2.集成开发环境,仿真器驱动程序。 三、实验内容 1.理解下列程序,新建工程,加入下面的程序,并观察实验结果 程序代码: x EQU 15;定义常量x=15 y EQU 61;定义常量y=61 stack_top EQU 0X1000;定义堆栈栈顶地址为0x1000 ENTRY;程序入口处 MOV sp,#stack_top;将堆栈指针指向栈顶 MOV r0,#x;将x的值放入r0 STR r0,[sp];将r0的值压入堆栈 MOV r0,#y;将y的值放入r0 LDR r1,[sp];将x的值放入r1 ADD r0,r0,r1;r0 = r0+r1 STR r0,[sp];将r0的值装入堆栈 Stop;B stop;程序结果为:r1 = x+y = 0x6D 2.编写程序循环R4~R11进行累加8次赋值,R4~R11初始值是1~8,每次操作后把R4~R11的内容放到SP栈中,SP初始设置为0x800,最后把R4~R11用LDMFD指令清空为0 程序代码如下: X EQU 1;定义常量x = 1 stack_top EQU 0X800;定义栈顶地址 ENTRY;MOV SP,#stack_top;将栈顶地址指向0x800 MOV R4,#1;设置R4 = 1 MOV R5,#2;设置R5 = 2 MOV R6,#3;设置R6 = 3 MOV R7,#4;设置R7 = 4 MOV R8,#5;设置R8 = 5 MOV R9,#6;设置R9 = 6 MOV R10,#7;设置R10 = 7 MOV R11,#8;设置R11 = 8 LOOP ADD R4,R4,#x;R4累加1 ADD R5,R5,#x;R5累加1 ADD R6,R6,#x;R6累加1 ADD R7,R7,#x;R7累加1 ADD R8,R8,#x;R8累加1 ADD R9,R9,#x;R9累加1 ADD R10,R10,#x;R10累加1 ADD R11,R11,#x;R11累加1 STMIA SP!,{R4-R11};将R4-R11的值压入堆栈 CMP R4,#9;比较R4和9的大小 BLT LOOP;R4 < 9继续执行循环 LDMFD SP!,{R4-R11};将R4-R11清零 END;实验结果:主要实现将数据2-9,3-10,4-11……9-16压入堆栈(初始地址是0x800处开始),最后将R4-R11全部清零。 3.更改实验中1中的X,Y的值,观察期结果 程序代码: x EQU 20 y EQU 120 stack_top EQU 0X1000 ENTRY MOV sp,#stack_top MOV r0,#x STR r0,[sp] MOV r0,#y LDR r1,[sp] ADD r0,r0,r1 STR r0,[sp] Stop B Stop END 程序结果为:r0 = x+y = 140 = 0X8C 实验三 ARM汇编语言程序设计 一、实验目的 1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程 2.掌握ARM汇编的存储器加载/存储指令,及if条件、循环、循环及循环的汇编实现 二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真器驱动程序 三、实验内容 1.理解下列程序,新建工程,加入下面的程序,并观察实验结果 程序代码: Num EQU 20;定义常量Num = 20 START;LDR r0,=src;将src数据块的开始地址存入r0中 LDR r1,=dst;将dst数据块的开始地址存入r1中 MOV r2,#Num;设置r2的值为20 MOV sp,#0x400;堆栈指针sp指向0x400 blockcopy;MOVS r3,r2,LSR #3;将r2左移3位移入r3并且影响标志位 BEQ copywords;结果为0的话跳转到copywords STMFD SP!,{r4-r11};将r4-r11的值入栈 octcopy;LDMIA r0!,{r4-r11};将src的前8个字数据存入让r4-r11 STMIA r1!,{r4-r11};将r4-r11中的数据放入dst数据块中 SUBS r3,r3,#1;r3 = r3-1 BNE octcopy;结果不为0跳转到octcopy LDMFD SP!,{R4-R11};恢复原来的r4-r11 copywords;ANDS r2,r2,#7;r2 = r2&7 BEQ stop;结果为0跳转到stop wordcopy;LDR r3,[r0],#4;将r0指向的字数据放入r3中,r0 = r0+4 STR r3,[r1],#4;将r3中的数据存入到dst数据块中,r1 = r1+4 SUBS r2,r2,#1;r2 = r2-1 BNE wordcopy;不为0跳转到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;程序结果:将src的数据全部存入到dst中 2.新建工程,并自行编写程序,分别使用LDR,STR,LDMIA,STMIA操作,实现对某段连续存储单元写入数据,并观察结果 程序代码: MOV R4,#1;设置r4 = 1; MOV R5,#2;设置r5 = 1; MOV R6,#3;设置r4 = 1; LDR R0,=dst;R0保存dst的首地址 STR R4,[R0];将r4的值装入r0执行的内存中 STR R5,[R0,#4];将r5的值装入r0+4执行的内存中 STR R6,[R0,#8];将r6的值装入r0+8执行的内存中 LDR R7,=src;R0保存src的首地址 LDMIA R7,{R8-R10};将r7执行的地址的数据读入r8=r10 LDR R3,=N;r3保存N的首地址 STMIA R3!,{R8-R10};将r8-r10装入r3指向的内存 N DCD 0,0,0 src DCD 1,2,3 dst DCD 0,0,0 END 程序结果:熟悉使用LDMIA,STMIA和LDR,STR指令 3.使用ARM汇编指令实现if条件执行,使用ARM汇编指令实现for条件执行,使用ARM汇编指令实现while条件执行,使用ARM汇编指令实现do…while条件执行。程序代码: 实现if条件: MOV R0,#1 MOV R1,#2 CMP R0,R1 BGT LOOP1 BLT LOOP2 LOOP1 MOV R3,R0 LOOP2 MOV R3,R1 END 程序结果: 实现for和while条件: MOV R1,#1 MOV R3,#0 MOV R2,#101;LOOP ADD R3,R1,R3 ADD R1,R1,#1 CMP R1,R2 BLT LOOP END 程序结果: 实现do…while条件: MOV R0,#1 MOV R1,#100 MOV R3,#0 LOOP CMP R0,R1 BGT STOP ADD R3,R0,R3 ADD R0,R0,#1 B LOOP STOP END 程序结果: 实验四 基于ARM的C语言程序设计 一、实验目的 1.了解ARM C语言的基本框架,学会使用ARM的C语言编程。2.掌握C语言和汇编语言编程的相互调用。 二、实验设备 1.EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。 三、ARM C语言简介与使用规则 1.ARM使用C语言编程是大势所趋 在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不宜移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。 2.ARM C语言程序的基本规则 在ARM程序的开发中,需要大量读写硬件寄存器,并且尽量缩短程序的执行时间的代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。 C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。 在使用C语言时,要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,使用将汇编文件以文件的形式加入项目当中,通过ATPCS的规定与C程序相互调用与访问。 ATPCS,就是ARM、Thumb的过程调用标准(ARM/Thumb Procedure Call Standard),它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。 在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件: ● 在子程序编写时,必须遵守相应的ATPCS规则; ● 堆栈的使用要遵守相应的ATPCS规则; ● 在汇编编译器中使用-atpcs选项。基本的ATPCS规定,请详见相关技术文档。 汇编程序调用C程序 汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。在调用C程序时,要正确设置入口参数,然后使用BL调用。 C程序调用汇编程序 汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。 在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。 在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup44b0/INC目录下都有一个44b.h的头文件,那里面定义了所有关于44B0的硬件寄存器的宏,对宏的读写,就能操作44B0的硬件。 具体的编程规则同标准C语言。 四、实验内容 1、理解下列程序,新建工程,加入下面的程序,并观察实验结果。程序代码: /*实现5个数的相加*/ int sum5(int a,int b,int c,int d,int e){ return(a+b+c+d+e);};汇编语言 IMPORT sum5;声明调用c函数 CALLSUMS STMFD SP!,{LR};将LR寄存器入栈 MOV R0,#1;r0 = 1 ADD R1,R0,R0;r1 = 2 ADD R2,R1,R0;r2 = 3 ADD R3,R1,R2;r3 = 5 STR R3,[SP,#-4]!;将r3的值入栈当做第五个参数 ADD R3,R1,R1;R3 = R3+R1=4 BL sum5;调用sum5 ADD SP,SP,#4;sp = sp+4 LDMFD SP,{PC} 程序结果:实现了i+2i+3i+4i+5i的汇编语言调用c语言 2、用汇编语言实现1到100累加的函数,用C言语编写主程序,在主程序中调用所编写的汇编函数 程序代码: NAME asmfile PUBLIC sum5 SECTION.intvec : CODE(2)CODE32 sum5 ENTRY MOV R1,#1 MOV R2,#0 sum6 ADD R2,R1,R2 ADD R1,R1,#1 CMP R1,R0 BLE sum6 MOV PC,LR END #include 总结 本次实验主要是通过对ARM的各种指令进行操作,通过对这些指令的应用,让我们学会了如何使用汇编来进行编程,掌握汇编编程和C语言编程的技巧,并且能够熟练的使用汇编语言,深刻理解ARM的工作。并且培养了我们写代码的能力以及对代码的阅读能力和修改能力。为我们在以后的学习和生活中更实用ARM,利用汇编进行编程奠定了一定的基础! 计算机专业类课程 实验报告 课程名称:嵌入式微处理器系统及应用 学 院:计算机科学与工程 专 业:计算机科学与技术 学生姓名:廖雪平学 号:2011060120003 指导教师:陈丽蓉 日 期:2014年5月15日 电子科技大学计算机学院实验中心 电 子 科 技 大 学 实 验 报 告 实验一 实验名称:熟悉嵌入式系统软件开发工具与环境 一、实验学时:4 二、实验内容和目的: AR熟悉嵌入式系统软件开发工具与环境 M处理器指令编程基础实验 ARM处理器工作模式实验 ARM处理器异常处理实验 编写2段汇编程序,一段实现数据区的拷贝,另一段实现对第一个程序的调用,完成参数传递和返回值的传递。数据拷贝程序需要判断传递参数的正确性:源数据区和目的数据区不能重叠,如果重叠则不进行拷贝操作,并返回错误码(1),否则进行数据拷贝并返回成功码(0)。 三、实验原理: M处理器指令编程基础。 ARM处理器工作模式 ARM处理器异常处理 四、实验器材(设备、元器件) Pc机、开发板 五、实验步骤 1、了解并连接开发板。 2、运行程序熟悉环境并对开发板进行测试。 3、编写程序并调试运行 4、完成实验内容。 5、调试并撰写实验报告。 六、实验数据及结果分析: 实验代码: 实验截图: 电子科技大学计算机学院实验中心 七、实验结论、心得体会和改进建议: 实验本身不会很难,但初次开发还是不太熟练,不过本实验让我更加熟练了ARM汇编的开发,以及熟悉了ARM的开发流程以及开发环境 电子科技大学计算机学院实验中心 电 子 科 技 大 学 实 验 报 告 实验二 一、实验名称:UART串口通讯实验 二、实验学时:4 三、实验内容和目的: 1) 在已有串口驱动软件及测试程序的基础上,修改测试程序,尝试对串口的各项通讯参数进行修改,并调整相应的与主机的连接配置,以便修改参数后的串口仍然能够正常通讯; 2)通过查阅芯片手册,尝试自行实现串口的初始化函数,替代已有驱动软件库中的串口初始化函数,并通过测试程序验证自行编写的函数的正确性。 四、实验原理:UART串口通讯原理 五、实验器材(设备、元器件) pc、开发板、相关环境 六、实验步骤: 1、了解实验内容 2、修改测试程序调整连接配置以便修改参数后的串口仍然能够正常通讯 2、编写实验代码 3、测试验证自行编写的函数的正确性。 七、实验数据及结果分析: 实验代码: 电子科技大学计算机学院实验中心 实验截图: 电子科技大学计算机学院实验中心 八、实验结论、心得体会和改进建议: 通过本实验让我对串口程序的编写有初步的了解,已经对软硬件间的衔接更加深刻的理解第四篇:嵌入式实验报告
第五篇:嵌入式实验报告