嵌入式实验一.docx
- 文档编号:14453714
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:28
- 大小:644.35KB
嵌入式实验一.docx
《嵌入式实验一.docx》由会员分享,可在线阅读,更多相关《嵌入式实验一.docx(28页珍藏版)》请在冰点文库上搜索。
嵌入式实验一
计算机与电子信息学院
嵌入式体系结构课程实验报告
专业:
计算机科学与技术班级:
计算机12-1
姓名:
学号:
120344801日期:
2014-12-12
一、实验题目
ARM920T逻辑功能推导及设计
二、实验目的
三、实验内容
S3C2410典型内核(ARM920T)结构图
处理器工作模式
2.1概述
S3C2410A采用了非常先进的ARM920T内核,它是由ARM(AdvancedRISCMachines)
公司研制的。
2.2处理工作状态
从程序员的角度上看,ARM920T可以工作在下面两种工作状态下的一种:
zARM状态:
执行32位字对齐的ARM指令;
THUMB状态:
执行16位半字对齐的THUMB指令。
在这种状态下,PC寄存器的第1位来选择一个字中的哪个半字。
注意:
这两种状态的转换不影响处理模式和寄存器的内容。
2.3切换状态
进入Thumb状态
进入Thumb状态,可以通过执行BX指令,同时将操作数寄存器的状态位(0位)置1来实现。
当从异常(IRQ,FIQ,UNDEF,ABORT,SWI等)返回时,只要进入异常处理前处理器处于Thumb状态,也会自动进入Thumb状态。
进入ARM状态
进入ARM状态,可以通过执行BX指令,并且操作数寄存器的状态位(0位)清零来实现。
当处理进入异常(IRQ,FIQ,RESET,UNDEF,ABORT,SWI等)。
这时,PC值保持在异常模式下的link寄存器中,并从异常向量地址处开始执行处理程序。
存储空间的格式
ARM920将存储器空间视为从0开始由字节组成的线性集合,字节0到3中保存了第一个字节,字节4到7中保存第二个字,依此类推,ARM920T对存储的字,可以按照小端(Littleendian)或大端(Bigendian)的方式对待。
大端格式:
在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,
如图3-4所示:
图3-4以大端格式存储字数据
小端格式:
与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址
存放的是字数据的高字节。
如图3-5所示:
图3-5以小端格式存储字数据
2.4指令长度
指令可以是32位长度(在ARM状态下)或16位长度(在THUMB状态)。
数据类型
ARM920T支持字节(8位),半字(16位)和字(32位)数据类型。
字必须按照4字节对齐,半字必须是2字节对齐。
2.5操作模式
ARM920T支持7种操作模式:
用户模式(user模式),运行应用的普通模式;
快速中断模式(fiq模式),用于支持数据传输或通道处理;
中断模式(irq模式),用于普通中断处理。
超级用户模式(svc模式),操作系统的保护模式
异常中断模式(abt模式),输入数据后登入或预取异常中断指令
系统模式(sys模式),是操作系统使用的一个有特权的用户模式
未定义模式(und模式),执行了未定义指令时进入该模式
外部中断,异常操作或软件控制都可以改变中断模式。
大多数应用程序都时是在用户模
式下运行。
进入特权模式是为了处理中断或异常请求或操作保护资源服务的。
2.6寄存器
ARM共有37个32位的寄存器,其中31个是通用寄存器,6个是状态寄存器。
但在同一时间,对程序员来说并不是所有的寄存器都可见。
在某一时刻存储器是否可见(可被访问),是由处理器当前的工作状态和工作模式决定的。
ARM状态寄存器
在ARM状态下,任何时刻都可以看到16个通用寄存器,1或2个状态寄存器。
在特权模式(非用户模式)下会切换到具体模式下的寄存器组,其中包括模式专用的私有(banked)寄存器。
图2-3显示了在每个模式下哪种寄存器是可见的:
私有寄存器上都有一个黑三角标记。
ARM状态寄存器系列中含有16个直接操作寄存器:
R0到R15。
除了R15外其他的都是通用寄存器,可用来存放地址或数据值。
除此之外,实际上有17个寄存器用来存放状态信息。
具体说明如下:
寄存器14:
专职持有返回点的地址,在系统执行一条“跳转并链接(link)”(BL)指
令的时候,R14将收到一个R15的拷贝。
其他的时候,它可以用作一个通用寄存器。
相应的它在其他模式下的私有寄存器R14_svc,R14_irq,R14_fiq,R14_abt和R14_und
都同样用来保存在中断或异常发生时,或时在中断和异常中执行了BL指令时,R15的
返回值。
寄存器15是程序计数器(PC)。
在ARM状态下,R15的bits[1:
0]为0,bits[31:
2]保存了PC的值。
在Thumb状态下,bits[0]为0同时bits[31:
1]保存了PC值。
寄存器16是CPSR(当前程序状态寄存器),用来保存当前代码标志和当前处理器模式位。
FIQ模式拥有7个私有寄存器R8-14(R8_fiq-R14_fiq)。
在ARM状态下,多数FIQ处理都不需要保存任何寄存器。
用户、中断、异常中止,超级用户和未定义模式都拥有2个私有寄存器,R13和R14。
允许这些模式都可拥有1个私有堆栈指针和链接(link)寄存器。
ARM状态下寄存器集
THUMB状态寄存器
THUMB状态寄存器是ARM状态寄存器的一个子集。
程序员可以直接操作8个通用
寄存器R0-R7,同样可以这样操作程序计数器(PC),堆栈指针寄存器(SP),链接(link)
寄存器(LR),和CPSR。
它们都是各个特权模式下的私有寄存器。
如下图所示:
ARM920T包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器
(SPSRs),备份的程序状态寄存器用来进行异常处理,这些寄存器的功能包括:
保存ALU当前操作的有关信息
控制中断的允许和禁止
z设置处理器的运行模式
程序状态寄存器的组成如图所示:
图2-4Thumb状态下寄存器结构
ARM和THUMB状态寄存器间的关系:
•THUMB态下R0-R7和ARM状态下R0-R7是等同的
•THUMB状态的CPSR和SPSRs跟ARM状态的CPSR和SPSRs是等同的
•THUMB状态下的SP映射在ARM状态下的R13上
•THUMB状态下的LR映射在ARM状态下的R14上
•THUMB状态下的程序计数器映射在ARM状态下的程序计数器上(R15)
图2-5显示了它们之间的关系:
图2-5THUMB状态下和ARM状态下寄存器之间的映射关系
在THUMB状态下访问高地址寄存器:
在THUMB状态下寄存器R8-15(高地址寄存器)不是标准寄存器集。
但是,汇编语言的程
序员可以访问它们并用它们作快速暂存。
向R8-R15写入或读出数据,可以采用MOV指令的某个变型,从R0-R7(低地址寄存器)
的某个寄存器传送数据到到高地址寄存器,或者从高地址寄存器传送到低地址寄存器。
还可
以采用CMP和ADD指令,将高地址寄存器的值与低地址寄存器的值相进行比较或相加。
想获得这方面更多的信息。
2.7程序寄存器状态
ARM920T具有一个当前程序状态寄存器(CPSR),另外还有5个保存程序状态寄存
器(SPSRs)用于异常中断处理。
这些寄存器的功能有:
保留最近完成的ALU操作的信息;
控制中断的使能和禁止;
设置处理器的操作模式。
下图2-6显示了程序状态寄存器的位定义:
2.7.1条件码标志
N、Z、C、V均为条件码标志位。
它们的内容根据算术或逻辑运算的结果所改变,并且可用来作为一些指令是否运行的检测条件。
在ARM状态下,绝大多数的指令都是有条件执行的,详情请看表3-2;
在Thumb状态下,仅有分支指令是有条件执行的,详情请看图3-46。
2.7.2控制位
PRS的低8位(包括I、F、T和M[4:
0])称为控制位,当发生异常时这些位会被改变,如果处理器在特权模式下运行,这些位也可以由程序修改。
T标记位
该位反映处理器的运行状态。
该位被设置为1时,处理器执行在THUMB状态,否则执行在ARM状态。
这些由外部信号TBIT反映出来。
注意软件绝不能改变CPSR的TBIT状态。
如果这样做,处理器将会进入一种不可
预知的装态。
中断禁止位
I、F位为中断禁止位,当它们被置1时可以相应地禁止IRQ和FIQ中断。
运行模式位
M4,M3,M2,M1和M0位(M[4:
0])是模式位,它们决定了处理器的操作模式,如
下表2-7所示。
并不是所有的组合都决定一个有效的处理器模式。
只有那些明确定义的值才能被采用。
用户必须意识到任何一种非法的值写入模式位,处理器都会进入到以种不可重获的状态,如果发生这种情况,就要进行复位。
保留位
PSR中的其余位为为保留位,当改变PSR中的条件码标志位或者控制位时,必须
确保保留位不被改变,在程序中也不要使用保留位来存储数据值。
图2-7PSR模式位的值
2.8异常
当正常的程序执行流程被临时中断时,称为产生了异常。
例如程序执行转向一个外设的
中断请求。
在异常能被处理前,当前处理器的状态必须被保留,这样按处理程序完成时就能
恢复原始的程序。
有可能同时产生好几个异常,如果出现这种情况,就应该按固定的顺序处理。
详情请看后面对异常优先级的说明。
2.8.1进入异常时的行为
当一个异常发生时,ARM920T将进行以下步骤:
1.将下一条指令的地址保存到相应的Link寄存器中。
如果异常是从ARM状态进入的,
下一条指令的地址(根据异常的类型,数值为当前PC+4或PC+8,具体请看表2-8)
拷贝到Link寄存器。
如果异常是从THUMB状态进入,那么写入到link寄存器的值
是当前的PC偏移一个值。
这表示异常处理程序不需要关心是从哪种状态进入异常的。
例如,在SWI情况下,无论是来自什么状态,处理程序只要采用MOVSPC,R14_svc
语句,总可以返回到原始程序的下一条语句。
S3C2410A中文数据手册(第一章)杭州立宇泰电子有限公司编著(Version1.0)
2.拷贝CPSR到相应的SPSR;
3.根据异常类型强制改变CPRS模式位的值;
4.令PC的值指向异常处理向量所指的下一条指令。
这时也可能设置中断禁能标志,以防止不可估计的异常嵌套发生。
当处理器处于Thumb状态时发生了异常,当PC载入异常矢量所在地址时,它将自动
地切换到ARM状态。
2.8.2离开异常处理时的行为
当完成异常处理时,处理程序应该:
1.将Link寄存器,减去相应的偏移量,赋给PC(偏移量的值由异常的类型决定);
2.拷贝回SPSR到CPSR;
3.如果在进入中断时设置了中断禁止标志,清除它。
注意,你不需要特别指明切换回THUMB状态。
因为原来的CPSR被自动地保存到了SPSR。
2.8.3异常进入/退出的总结
表2-8总结了在进入异常时,保留到相应的R14中的PC的值,和推荐使用的退出异
常处理时采用的语句。
注意:
1.这里PC所赋的是BL/SWI/未定义模式等指令所取的地址,它们在预取的阶段就被中断了。
2.这里PC所赋的是由于FIQ或IRQ取得了优先权,而没有来得及得到执行的指令地址。
3.这里PC所赋的地址是Load或Store指令的地址,它们在执行时产生了数据的异常中断。
4.在R14_svc复位之前保存的数值是不可预知的。
2.8.4FIQ中断
FIQ(快速中断请求)异常通常是用来支持数据传输和通道操作的,在ARM状态下,它具有充分的私有(私有)寄存器,用来减少寄存器存取的需要(从而减少进入中断前的“上下文切换”的工作)。
FIQ中断是由外部设备通过拉低nFIQ引脚触发的。
通过对ISYNC输入引脚的控制nFIQ
可以区别同步或异步的传输情况。
当ISYNC为低电平,nFIQ和nIRQ将被认为是异步的,
中断之前产生同步周期延长的话会影响处理器的流程。
不管是ARM还是Thumb状态下的异常,FIQ处理程序都可以通过执行以下的语句来退出中断处理:
SUBSPC,R14_fiq,#4
通过设置CPSR的F标记位可以禁止FIQ中断(但是要注意到在用户模式下是不可行的)。
如果F标记位已经清除,ARM920T在每个指令的最后检测来自FIQ中断同步器的低电输出。
2.8.5IRQ中断
IRQ(中断请求)异常是由nIRQ输入低电平引发的普通中断。
IRQ中断相对FIQ中断来说是优先级低,当一个FIQ中断序列进入时它将被屏蔽。
IRQ也可以通过设置CPRS中的“I”标志来禁止,同样也不能够在用户模式中这样做(只能在特权模式下这样做)。
无论IRQ发生在ARM或者Thumb状态下,都可以采用以下语句来退出中断处理:
SUBSPC,R14_irq,#4
2.8.6Abort异常中止
异常中止表示当前存储访问不能完成。
通过外部的ABORT输入信号来告知内核。
ARM920T在每次的存储操作中检测该异常是否发生。
有两种类型的异常中止:
z预取指异常中断:
指令预取时产生
z数据异常中断:
数据访问时产生
如果产生预取指中止,所取得的指令将会被标志为无效的,但是异常不会立即发生,要直到取指到达了管道的头部才会发生。
如果这些指令不执行——例如在管道内发生了分支跳转,那么异常就不会发生了。
如果产生数据异常中止,根据指令类型进行操作:
简单数据传输指令(LDM,STR)写回改变的基址[变址]寄存器:
异常中断处理器必
须清楚这些。
取消交换指令尽管它还没执行;
数据块传输指令(LDM,STM)完成。
如果设置为写回,基址已经校正。
如果指令超
出了数据的写基址(传输目录中有它的基址),就应该防止写超出。
在中止异常将发生时,所有寄存器的覆盖写入都是禁止的。
这意味着特别是R15(经常是最后一个改变的寄存器)的值将在中止的LDM指令中保留下来。
Abort机制使得页面虚拟存储器机制得以实现。
在采用虚拟存储器的系统中,处理器可
以产生任意的地址。
当某个地址的数据无效,MMU(存储器管理单元)将产生一个abort中止。
这样abort的处理程序就必须找出异常中断的原因,使要求的数据可用,并重试被中止掉的指令。
应用程序也就不需要了解实际可用存储空间的大小,也不需要了解异常中断对它的影响。
在完成了异常中断的处理后,通过以下语句退出中断处理(与ARM状态还是Thumb状
态无关):
SUBSPC,R14_abt,#4;预取指abort
SUBSPC,R14_abt,#8;数据abort
通过执行该语句,就恢复了PC和CPSR,并重试被中断的指令。
2.8.7软件中断
SWI(软件中断指令)用来进入超级用户模式,通常用于请求特殊的超级用户功能。
SWI
的处理程序通过执行以下语句,退出异常处理(ARM或Thumb):
MOVPC,R14_svc
通过执行该语句,就恢复了PC和CPRS,并返回到SWI后面的指令上。
注意:
前面提到的nFIQ,nIRQ,ISYNC,LOCK,BIGEND,和ABORT引脚只存在于ARM920T
CPU的内核上。
2.8.8未定义指令
当ARM920T遇到一个它不能执行的指令,它将产生一个未定义指令陷阱。
这个机制是软件仿真器用来扩展Thumb和ARM指令集用的。
在完成对未知指令的处理后,陷阱处理程序应该执行以下的语句退出异常处理(无论是
ARM或Thumb状态):
MOVSPC,R14_und
通过执行该语句,恢复了CPSR,并返回执行未定义指令的下一条指令。
2.8.9异常中断向量
异常中断的向量地址如下图所示:
地址异常中断类型进入时处理器模式
0x00000000ResetSupervisor
0x00000004UndefinedinstructionUndefined
0x00000008SoftwareInterruptSupervisor
0x0000000CAbort(prefetch)Abort
0x00000010Abort(data)Abort
Linux下基于ARM920T的USB摄像头图像采集
GettingimagedatawithUSBcamerabasedonLinuxandARM920T
摘要:
随着USB摄像头的普及和基于ARM核的嵌入式芯片的快速发展,二者结合的便携性越来越受到人们欢迎,而嵌入式Linux的迅速发展更为二者的结合铺平了道路,本文介绍了基于ARM920T的嵌入式Linux下利用USB摄像头采集图像的硬件、软件设计过程,最终实现了在目标板上图像的采集和显示。
关键谓q:
ARM;USB摄像Yc;VideoforLinux;[]像采集;嵌入式Linux
中图分类号-:
TP335;TP274文献标iR码:
B
Abstract:
WithwidelyandrapidlyusingofUSBcameraandARM-basedmicrocontroUer,itisverypopularthattheUSBcameraisusedwithARMprocessor.AttheSalTI(,time,theembeddedLinuxtechnologyisboostingapplicationjointing.HardwareandsoftwareofgatheringimagedataviaUSBcamerabasedonLinuxandARM920Tisproposedinthispaper.Finally,Wesuccessfullygettheim·agedataanddisplaytheimageOilthetargetboard.
Keywords:
ARM,USBcamera,VideoforLinux,Gettingimagedata,embeddedLmux
1基于AI眦920T的USB摄像头图
像采集硬件平台
图
(1)中各个主要模块基本组成描述如下:
①微处理器(MPU):
针对开发多媒体视频终端的需要,并考虑到系统外围设备的需求情况,本系统采用SAMSUNG公司内嵌ATIVl920T内核的三星$3C2410处理器。
最高主频可达203MHz。
②SDRAM存储部分采用两颗Hynix公司的HY57V561620CT内存,大小为32M。
③FLASH存储器采用SAMSUNG公司的K9F1208UOMNandFlash.大小为64M。
④USB集线器芯片:
采用ALCORMICRO公司的AU9254A21,可扩展为4个USB外围接口,分别连接图
(1)中所示的四个外围设备。
⑤LCD:
采用Sharp公司的3.5寸LCD,分辨率为240x320。
2基于A砌江920T的USB摄像头图像采集的软件系统
由于嵌入式Hnux具有成本低、代码开放、移植性好的特点.其用于嵌入式系统的优势和发展潜力是不容置疑的。
软件部分的搭建主要依赖于以下三个部分:
①Boatloader:
可以从SAMSUNG公司的官方网站获取,经过交叉编译生成映像文件,然后通过JTAG接口将映像烧写到目标板,实现引导程序的装载。
②Kernel:
本系统采用Linux一2.4.18.tar.gz版本的内核。
③文件系统:
由于本系统要进行动态的擦写FLASH,所以采用了支持此功能的YAFFS文件系统。
Linux平台的驱动一般分为字符设备、块设备和网络设备三种类型。
而在Linux下要使系统所挂接的外部设备正常工作,必须加载相应的驱动程序。
Linux下对于一个硬件的驱动,可以有两种方式:
一种是直接加载到系统的内核当中去,另一种是以模块方式进行加载,就是在编译内核的时候,同时生成可重定位的目标文件(.O文件)。
项目中所用的SBC2410X的实验板的USB主控器驱动程序模块为USB—OHCI一$3C2410.0。
在Linux下要采集视频类数据,需要加载Vide04Linux驱动模块Videodev.0。
然后再加相应的摄像头驱动程序。
在项目开发中,我们所使用的摄像头采用的USB控制器为ov51l+,所对应的驱动程序模块为ov511.o。
所以在系统启动时必须要通过如下命令:
>>insmodvideodev.O
>>insmodusb—ohci—s3c2410.O
>>insmodov511.o
来加载所需要的模块。
通过开源项目spca5xx可以得到上边所需模块的全部源代码。
上层软件部分我们参考了vidcat,vgrabber,w3cam,gqcam这几种软件的操作过程,重点参照了vidcat进行了V4L编程,使用了v41.C和vidcat.C中的函数,经过交叉编译。
在实验板上实现了实时图像采集的目的。
在图
(2)中显示了各个模块之间的关系,其中从上到下的箭头流向表示通过各个模块启动和配置摄像头,从下到上的箭头流向表示由摄像头所采集的图像数据经各个模块采集到用户指定的位置o
3在Linux下采集并显示USB摄像头数据
Linux下摄像头的驱动程序是以81为主设备号,在编写应用程序的时候。
要通过打开一个具有该主设备号的设备文件来建立与设备驱动程序的通信,我们所使用的Linux没有该文件,所以需要手工创建,并建立其软连接,因为要对文件进行操作,所以要改变其访问权限为666。
我们用到的videodev.O模块即为视频部分的标准VideoforLinux简称v4L)。
这个标准定义了一套接13,内核、驱动、应用程序以这个接口为标准进行通信。
3.1图像数据的采集过程:
第一步:
要打开摄像头设备,而在Linux下可以通过系统的设备文件来访问设备.在前面我们创建并建立了摄像头的设备文件.所以文件描述符(dev)可以如下方法获取:
whilemax_try){
dev=open(device,O—RDWR);
if(dev==-1){
if(!
一max_try)f
fprinff(stderr,”Can7topendevice%s、Il”,device);
return
(1);}/*max_try为试图打开设备的最多次数4/
sleep
(1);
)else{break;))
第二步:
进行访问摄像头设备的状态信息。
首先我们可以在kernel的源代码中找到头文件videodev.h,这个头文件定义了我们要编写的应用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验