嵌入式系统实验.docx
《嵌入式系统实验.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验.docx(59页珍藏版)》请在冰豆网上搜索。
嵌入式系统实验
嵌入式系统实验指导书
计算机科学与技术学院
实验教学中心
2007-9-1
实验一JediView调试环境及软件编程………………………………………3
实验二系统初始化和存储器实验………………………………………………8
实验三键盘和中断实验………………………………………………………12
实验四S3C44B0X定时器实验…………………………………………………19
实验五LCD显示实验…………………………………………………………22
实验六、uclinux文件系统实验……………………………………………………………26
实验一JediView调试环境及软件编程
一、实验目的
1.了解调试软件JediView,掌握在JediView环境中新建工程,及其编译,调试工程的方法。
2.掌握在JediView环境下arm系统中C语言编程及调试方法
3.掌握arm汇编语言编程及调试方法。
二、实验内容
1.学习使用JediView集成开发环境:
新建一个工程arm1_1,设置并编译该工程,通过JEDI仿真器下载已经编译好的文件到实验仪中运行。
观察实验仪上的执行结果。
掌握调试程序方法,为下面调试应用程序打下基础。
2.建立工程arm1_2,编写C语言程序arm1_2.c实现1+2+3+…+N(arm1_2.c写在预习报告上)。
3.建立工程arm1_3,用arm汇编语言编写程序arm1_3.s,实现带参数的子程序调用(用程序跳转表实现),调用参数r0=0,做r1+r2=>r0;r0=1,做r1-r2=>r0(arm1_3.s写在预习报告上)。
三、预备知识
1.关于JediView调试环境基本使用方法。
JediView具备一个标准调试软件的绝大部分功能,主要由以下模块组成:
源程序编辑器(Editor):
用来完成源程序的编辑、修改等任务。
编译器(BuildSystem):
把源程序(包括C,C++,汇编)编译生成机器码和可调试代码。
调试器(Debugger):
对编译成功的源程序进行调试,如走单步,设断点,全速运行等。
项目管理器(ProjectManager):
管理项目设置,包括运程序路径,编译选项等。
2.ARM指令系统,汇编语言编程知识。
3.C语言编程能力。
四、实验设备及工具(包括软件调试工具)
硬件:
Micetek44B0实验系统,PowerProbeJTAG仿真器,PC机Pentumn100以上
软件:
PC机操作系统win98、win2000、winXP,JediView集成开发环境
五、实验步骤
1.学习使用JediView集成开发环境,建立一个工程,添加源程序、编译、下载、调试。
①系统配置:
在桌面点击图标ConfigurationforARM打开窗口如图1所示,其中
Protocol:
选择与JediView连接的仿真器协议类型:
如果调试软件没有与目标板连接,进行软件仿真选择Simulator
通过计算机并口和Powerprobe与目标板连接,选择PowerProbe
通过JDEI以太网口仿真器连接,选择JEDI
CpuCore:
选择CPU内核类型
CpuName:
选择具体CPU型号
Endian:
选择Memory大小模式
Initial_File:
选择CPU初始化文件
Semihosting:
Semihosting功能开关
SWI_Vector_Address:
SWI异常向量地址
Top_Memory:
当使用Semihosting功能时,设置Momeory的上限地址
Cache_Memory:
如果目标CPU为ARM940T/920T,设置仿真器预留Memory空间
Reset_Option:
选择是否采用硬件复位
请参照图1_1所示进行配置。
一旦配置好后,所有在forARM环境下运行的工程都可沿用此配置,无需再重复配置。
图1_1ConfigurationforARM配置图
在桌面建立一个文件夹arm1_1,将:
Init.s,arm1_1.c拷贝到该文件夹中。
双击桌面JediView图标,进入JediView,新建一个工程文件arm1_1,工程内包括两个源文件:
Init.s,arm1_1.c。
设置工程;
编辑源文件,将源文件加入到工程中。
⑥编译工程。
⑦下载。
⑧运行。
观察实验仪上的运行结果。
2.按步骤1的②—⑦建立工程arm1_2,用C语言编程序arm1_2.c,实现1+2+3+…+N。
下载后设置断点,连续或单步执行程序,参见附录1,设置观察点,调试程序。
3.按步骤2建立工程arm1_3,用arm汇编语言编写程序arm1_3.s,实现带参数的子程序调用(用程序跳转表实现),调用参数r0,若r0=0,做32位加法;r0=1,则做32位减法。
参见附录1,设置观察点,调试程序。
六、参考程序
/*************************************************************
arm1_1.c
**************************************************************/
#defineled_Address0x6000000
voidLed_Display(unsignedchardata);
voidMain(void)
{
inti,j;
while
(1)
{
for(i=0x0a;i<=0xf;i++)
{
Led_Display(i);
for(j=0;j<=0x03ffff;j++)
j++;
}
}
}
/********************S3C44B0XEV.BOARDLED**********************
//-ga:
data0b:
data1
//a/_b/fc:
data2d:
data3dp:
data4
//c/_d/edpe:
data5f:
data6g:
data7
******************************************************************/
voidLed_Display(unsignedchardata)
{
unsignedchar*ledbuffer=(unsignedchar*)led_Address;
switch(data){
case0:
*ledbuffer=0x12;
break;
case1:
*ledbuffer=0x9F;
break;
case2:
*ledbuffer=0x31;
break;
case3:
*ledbuffer=0x15;
break;
case4:
*ledbuffer=0x9C;
break;
case5:
*ledbuffer=0x54;
break;
case6:
*ledbuffer=0x50;
break;
case7:
*ledbuffer=0x1F;
break;
case8:
*ledbuffer=0X10;
break;
case9:
*ledbuffer=0x14;
break;
case0xa:
*ledbuffer=0x8;
break;
case0xb:
*ledbuffer=0xC0;
break;
case0xc:
*ledbuffer=0x62;
break;
case0xd:
*ledbuffer=0x81;
break;
case0xe:
*ledbuffer=0x60;
break;
case0xf:
*ledbuffer=0x68;
break;
}
}
附录1调试工具栏
调试工具栏如图1_2所示:
图1_2调试工具栏图
其中命令按钮功能如图1_3所示:
图1_3命令按钮功能图
实验二系统初始化和存储器实验
一、实验目的
1.了解arm系统初始化的方法。
2.熟悉ARM处理器存储器空间分配。
3.掌握用arm指令配置存储空间的方法。
4.掌握对存储区访问的方法。
二、实验内容
1.读懂44binit.S系统初始化程序,跟踪执行44binit.s,了解系统复位后初始化过程。
(44binit.s完成的操作内容示意图见附录2图2_1。
)
2.编写arm汇编语言程序arm2_1.s,实现字长读/写、半字读/写、字节读/写(将arm2_1.s写在预习报告上)。
3.编写arm汇编语言程序arm2_2.s,实现将一块字数据从源数据区复制到目的数据区(将arm2_2.s写在预习报告上)。
4.编写C语言程序arm2_3.c,实现将一块字数据从源数据区复制到目的数据区(将arm2_3.c写在预习报告上)。
三、预备知识
1.ARM处理器存储器空间分配,ARM用寄存器组配置存储空间的方法。
2.ARM指令系统:
存储器读/写指令,基址加偏址寻址,汇编语言编程知识。
3.C语言编程能力。
四、实验设备及工具(包括软件调试工具)
硬件:
Micetek44B0实验系统,PowerProbeJTAG仿真器,PC机Pentumn100以上
软件:
PC机操作系统win98、win2000、winXP,JediView集成开发环境
五、实验步骤
1.了解系统复位后初始化过程。
建立子目录arm2_0,将44binit.s拷贝到该目录(在44binit.s中BLMain指令处加一个标号Main:
);按照JediView调试环境介绍中的步骤,新建工程arm2_0,设置工程参数,添加源文件,包含文件44binit.s,编译,下载,单步跟踪执行,观察每一步执行结果,了解系统复位后初始化过程。
2.建立工程arm2_1,用arm汇编语言实现字长读/写、半字读/写、字节读/写。
在工程arm2_1中添加源文件44binit.s,arm2_1.s,编译、下载、调试。
3.建立工程arm2_2,用arm汇编语言实现将一块字数据,从源数据区复制到目的数据区。
编译下载后调试方法:
①在arm2_2.s入口处设断点,全速执行程序到断点处后,单步执行程序,观察源数据区地址指针、目的数据区地址指针,打开memery窗口找到相应地址观察数据块复制情况.
②若使用了堆栈,观察堆栈指针,找到栈底,观察堆栈变化
4.建立工程arm2_3,用C语言编写程序arm2_3.c,实现将一块字数据,从源数据区复制到目的数据区。
六、参考程序
/********************************************************
arm2_1.s
********************************************************/
.globalMain
//.text
Main:
ldrr2,=0x0c010000//字写:
0x11223344-->[0xc01000---0xc01003]
ldrr3,=0x11223344//r2=0x0c010000
strr3,[r2]
ldrr3,=0x0//字读
ldrr3,[r2],#4
ldrhr3,[r2]//半字读:
[0x0c010004--0xc010005]-->r3
//r2=0x0c010004
ldrr3,=0x5566//半字写0x5566-->[0xc01004,0xc01005]
strhr3,[r2],#2//后变址r2=0xc01006
ldrr3,=0x7788
strhr3,[r2],#-2//半字写0x7788-->[0xc01006,0xc01007]
//r2=0x0c010004
ldrhr3,[r2],#2//半字读:
[0x0c010004--0xc010005]-->r3ldrhr3,[r2],#2//半字读:
[0x0c010006--0xc010007]-->r3
ldrbr3,=0x99
strbr3,[r2],#1//字节写:
0x99-->[0xc01008],r2=0x0c010009
ldrbr3,=0xaa
strbr3,[r2]//字节写:
0xaa-->[0xc01009],r2=0x0c010009
ldrbr3,[r2,#-1]//字节读:
[0x0c010008]-->r3
ldrbr3,[r2]//字节读:
[0x0c010009]-->r3
stop:
nop
bstop
.end
/*******************************************************
arm2_2.s
********************************************************/
.globalMain
.text
.equnum,20//复制字数
Main:
ldrr0,=src//源数据区指针
ldrr1,=dst//目的数据区指针
movr2,#num
Bcopy:
movsr3,r2,lsr#3//以8个字为单位的复制次数
beqCword//不足8个字的数据,以字为单位拷贝
stmfdsp!
{r4-r11}//保护工作寄存器(SVCstack栈底0xc7ffb00,见44binit.s)
Ocopy:
ldmiar0!
{r4-r11}//将源数据区8个字数据==>目的数据区,并更新地址指针(!
)
stmiar1!
{r4-r11}//
subsr3,r3,#1//块(8个字)复制次数减一
bneOcopy
ldmfdsp!
{r4-r11}//以8个字为一块复制结束,恢复工作寄存器
Cword:
andsr2,r2,#7//取余下的不足8个字的字数(=>r2),为零则结束stop
beqstop
Wcopy:
ldrr3,[r0],#4//否则,每次拷贝一个字数据,直至r2=0
strr3,[r1],#4
subsr2,r2,#1
bneWcopy
stop:
nop
bstop
//.data
src:
.word1,2,3,4,5,6,7,8,9,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x010,0x011,0x012,0x013,0x014
dst:
.word0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.end
七、附录2
initial.s完成的操作内容示意图见图2_1.
图2_1initial.s完成的操作内容示意图
实验三键盘和中断实验
一、实验目的
1.了解ARM处理器的中断机制。
2.掌握S3C44B0X中断的编程方法。
3.学习用中断和查询两种方式实现键盘扫描功能。
二、实验内容
1.编写程序arm3_1.c按中断方式扫描实验仪上的4*4键盘,并在实验仪数码管上显示键码。
(预习:
将arm3_1.c写在预习报告上。
结合教材有关S3C44B0X的中断、I/O端口的章节,阅读参考程序keyboard.c中的几个函数,掌握中断和键盘扫描的编程方法。
main()//
keyboard_ISR()//键盘中断服务(键盘扫描/译码)
Port_Init()//对I/O端口初始化
Isr_Init()//IRQ中断初始化
Led_Display(chardata)//数码管显示)
2.编写程序arm3_2.c按查询方式扫描实验仪上的4*4键盘,并在实验仪数码管上显示键码。
(将arm3_2.c写在预习报告上)。
三、预备知识
1.ARM处理器的中断机制。
2.S3C44B0X的I/O控制寄存器、中断控制寄存器。
3.键盘扫描知识。
4.C语言编程能力。
四、实验设备及工具(包括软件调试工具)
硬件:
Micetek44B0实验系统,PowerProbeJTAG仿真器,PC机Pentumn100以上
软件:
PC机操作系统win98、win2000、winXP,JediView集成开发环境
五、实验步骤
1.实现按中断方式扫描实验仪上的4*4键盘,并在实验仪数码管上显示键码。
建立子目录arm3_1,将44binit.s、keyboard.c(或arm3_1.c)复制到该目录下。
建立工程arm3_1,将44init.s、keyboard.c添加到该工程下,编译、下载、运行,运行中,按4*4键盘上的任一键,应在数码管上显示该键码。
2.编写程序arm3_2.c,实现按查询方式扫描实验仪上的4*4键盘,并在实验仪数码管上显示键码。
建立子目录arm3_2,将44init.s、arm3_2.c复制到该目录下。
建立工程arm3_2,将44init.s、arm3_2.c添加到该工程下,编译、下载、运行,运行中,按4*4键盘上的任一键,应在数码管上显示该键码。
六、键盘硬件电路及arm3_1参考程序keyboard.c
1.键盘硬件电路
实验仪的键盘电路由S3C44B0的I/O口和外部中断构成,见图3_1实验仪的键盘电路图,S3C44B0X处理器G口的PG7—PG4四位作输出,F口的PF8—PF5四位作输入,构成4行4列的4*4键盘。
无键按下时,PF8—PF5四列被上拉为高电平,按键按下将会使行、列连成通路。
扫描键盘时,首先向PG7—PG4四行输出“0”,然后从PF8—PF5读入,若读入的4位列值为全“1”,说明无键按下。
当任一键按下时,从PF8—PF5读入的列值将不是全“1”,此时可向PG7—PG4逐行输出“0”,然后从PF8—PF5读入列值,以判别哪一个键被按下。
F口的PF8—PF5位经负或门接至外部中断EXINT0,没有键按下时,PF8—PF5被上拉至高电平;当F口的PF8—PF5任一列有键按下时,将引发EXINT0键盘中断。
图3_1实验仪键盘电路图
2.参考程序
/*************************************
keyboard.c
*************************************/
#include
#include"..\inc\option.h"
#include"..\inc\44b.h"
#include"..\inc\44blib.h"
#include"..\inc\def.h"
#include"..\inc\kb.h"
voidIsr_Init(void);
voidHaltUndef(void);
voidHaltSwi(void);
voidHaltPabort(void);
voidHaltDabort(void);
voidDelay(inttime);
//voidPort_Init(void);
voidLed_Display(unsignedchardata);
voidkeyboard_ISR(void);
voidTest_Kb(void);
voidmain(void)
{
rSYSCFG=SYSCFG_8KB;//(0x6)speedfaster
Isr_Init();
Port_Init();
pISR_EINT0=(unsigned)keyboard_ISR;
rINTMSK=~(BIT_GLOBAL|BIT_EINT0);
while
(1);
}
voidkeyboard_ISR(void)
{
charx,y,xrecord,yrecord,temp;
rI_ISPC=BIT_EINT0;//clearpending_bit
Delay(400);//delay40ms
if((rPDATF&0x1E0)==0x1E0)
{
return0;//nokeyboardpress,return
}
else
{
x=1;
y=1;
xrecord=(~((rPDATF&0x1E0)>>1));
xrecord=xrecord>>4;
while(xrecord!
=0x1)//judgerow
{
x=x+1;
xrecord=xrecord>>1;
if(xrecord==0)
{
rPDATG=0X0F;//no,return
return0;}
}
Delay(200);//delay20ms
rPDATG=0XEF;//inputhigh
while((rPDATF&0x1E0)==0x1E0)
{
rPDATG=rPDATG<<1;
temp=rPDATG;
if((temp&0xf0)==0XF0)//noboardpress,return
{
rPDATG=0X0F;
return0;}
}
Delay(200);//delay10ms
yrecord=~((rPDATG&0xF0)>>4)&0x0F;
while(yrecord!
=0x1)//judgeline
{
y=y+1;
yrecord=yrecord>>1;
if(yrecord==0)
{
rPDATG=0X0F;//noboardpress,return
return0;}
}
Led_Display(x+(y-1)*4-1);
Delay(1200);//delay40ms
rPDATG=0X0F;
}
}
voidIsr_Init(void)
{
U32i;
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI=(unsigned)HaltSwi;
pISR_PABO