ARM9复习.docx
- 文档编号:30453400
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:36
- 大小:3.04MB
ARM9复习.docx
《ARM9复习.docx》由会员分享,可在线阅读,更多相关《ARM9复习.docx(36页珍藏版)》请在冰豆网上搜索。
ARM9复习
ARM9嵌入式复习
I2C题目的正确答案
makefile写法
Makefile实例:
#makefile开始
myprog :
foo.o bar.o
gcc foo.o bar.o -o myprog
foo.o :
foo.c foo.h bar.h
gcc -c foo.c -o foo.o
bar.o :
bar.c bar.h
gcc -c bar.c -o bar.o
clean:
-rm*.omyprog
#makefile结束
Makefile变量
使用环境变量后的makefile实例
=======makefile开始======
OBJS=foo.obar.o
CC=gcc
CFLAGS=-Wall–O–g
myprog:
$(OBJS)
$(CC)$(OBJS)-omyprog
foo.o:
foo.cfoo.hbar.h
$(CC)$(CFLAGS)-cfoo.c-ofoo.o
bar.o:
bar.cbar.h
$(CC)$(CFLAGS)-cbar.c-obar.o
========makefile结束=======
课件第九章讲的很详细
创建交叉编译环境
(1)创建编译环境。
(2)建立内核头文件
(3)创建binutils。
(4)创建一个交叉编译版本的gcc
(5)创建一个交叉编译版本的glibc
(6)重新创建gcc
Hello程序
//hello.c
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("DavidXie");
MODULE_DESCRIPTION("HelloWorldModule");
MODULE_ALIAS("asimplestmodule");
externintadd_integar(inta,intb);
externintsub_integar(inta,intb);
staticint__inithello_init()
{intres_add=add_integar(1,2);
printk(“res_add=%d\n”,res_add);
return0;
}
staticvoid__exithello_exit()
{intres_sub=sub_integar(2,1);
printk(“res_sub=%d\n”,res_sub);
}
module_init(hello_init);
module_exit(hello_exit);
1、ARM微处理器支持虚拟内存,它是通过系统控制协处理器CP15和MMU(存储管理部件)来进行虚拟内存的存储和管理。
当系统发生数据异常和
指令领取异常时,异常处理程序透过嵌入式操作系统的内存管理机制,通过MMU交换物理内存和虚拟内存的页面,以保证程序正常执行。
1、一般而言,嵌入式系统的构架可以分为4个部分:
分别是(处理器)、存储器、输入/输出和软件,一般软件亦分为操作系统相关和(应用软件)两个主要部分。
1.请简述嵌入式系统的设计过程。
嵌入式系统得设计过程:
(1)系统定义与需求分析
(2)系统设计方案的初步确立
(3)初步设计方案性价比评估与方案评审论证
(4)完善初步方案、初步方案实施
(5)软硬件集成测试
(6)系统功能性能测试及可靠性测试
4、什么是嵌入式操作系统?
为何要使用嵌入式操作系统?
是一段在嵌入式系统启动后首先执行的背景程序,首先,嵌入式实时操作系统提高了系统的可靠性。
其次,提高了开发效率,缩短了开发周期。
再次,嵌入式实时操作系统充分发挥了32位CPU的多任务潜力。
1、什么是嵌入式系统?
嵌入式系统的特点是什么?
嵌入式系统是以应用为中心,以计算机技术为基础,软件硬件可裁剪,功能、可靠性、
成本、体积、功耗严格要求的专用计算机系统。
嵌入式系统的主要特点如下:
高实时性OS、系统内核小
专用性强
系统精简
实时性和可靠性要求高
嵌入式软件开发走向标准化
嵌入式系统需要专门的开发工具和环境
1.ARM9处理器的特点?
ARM微处理器采用RISC架构,一般具有如下特点:
(1)体积小、功耗低、成本低、性能高;
(2)支持Thumb/ARM双指令集,兼容8位/16位器件;
(3)大量使用寄存器,执行执行速度更快;
(4)大多数数据操作都在寄存器中完成;
(5)寻址方式灵活简单,执行效率高;
(6)指令长度固定
T:
:
控制指令执行状态。
1执行Thumb指令,0执行ARM指令
I,F:
中断禁止位。
1(禁止IRQ,FIQ中断响应),0(允许IRQ,FIQ中断响应)
M[4:
0]:
模式位。
处理器操作模式
10000busr,10001bfiq,10010birq,10111babt,11011bund,11111bsys,10011svc
2.字符设备和块设备的主要区别?
块设备(如硬盘)字符设备(如串口)
字符设备以字节为单位逐个进行I/O操作,在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了。
块设备利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实际的I/0操作。
块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。
3.Linux内核的配置,编译linux内核
配置内核:
makemenuconfig
建立依赖关系:
makedep
编译内核:
makezImage
4.嵌入式应用程序的开发的基本步骤
(1)编辑源文件*.c
(2)交叉编译器编译为目标板的可执行文件
(3)将可执行文件下载到目标板,或用mount挂载到目标板
(4)在目标板上执行
(5)正确?
不正确则返回
(1)修改源文件
(6)结束
5.应用软件移植
(1)源代码搜索和下载
(2)解压应用程序
(3)执行一个./configure来自动生成Makefile
(4)检查一下是否可以在REDHATLINUX上编译通过#make
(5)若可以通过编译,则可以着手来修改Makefile,修改编译器CC、AR、RANLIB等为交叉编译工具
(6)在交叉编译工具下编译
(7)找出出错的文件,注释掉,或写空函数代替
(8)直到编译通过为止
6.驱动程序的设计
(1)嵌入式Linux的内核空间和用户空间
(2)设备文件:
在Linux系统中,硬件设备被当作文件处理,称为“设备文件”。
对“设备文件”的(I/O)操作会调用相对应的设备驱动程序操作硬件设备。
设备文件有主次设备号,Linux系统通过主次设备号来联系驱动程序和设备文件节点。
(3)嵌入式Linux驱动程序的结构
自动配置和初始化
I/O端口请求
中断服务
(4)Linux驱动程序开发流程
◆修改代码
◆编译驱动
◆加载驱动
◆软硬件联合调试
◆卸载驱动
(5)驱动程序的加载方式
驱动程序直接编译入内核
◆Deriver.c加入内核文件夹
◆配置内核mekemenucconfig
◆编译内核makedep;makezImage
◆下载内核tftp
驱动程序的模块加载
编辑deriver.c
编译驱动程序为模块deriver.o
动态加载到系统:
insmodderiver.o
7.S3C2410的中断处理流程
当发生状态转移时:
OldPC->R14;
OldCPSR->SPSR;
PC为新状态的指令地址,保存在R14中;
R13为新状态的堆栈指针;
将CPSR复制到相应的SPSR
第一章
1.嵌入式微处理器的分类。
a)什么是嵌入式微处理器?
1.嵌入式微处理器是嵌入式系统硬件层的核心,嵌入式微处理器将通用CPU中许多由板卡完成的任务集成到芯片内部,从而有利于系统设计趋于小型化、高效率和高可靠性。
嵌入式微处理器大多工作在为特定用户群所专门设计的系统中。
2.嵌入式微处理器的体系结构可以采用冯·诺依曼体系结构或哈佛体系结构,指令系统可以选用精简指令系统(ReducedInstructionSetComputer,RISC)和复杂指令集系统CISC(ComplexInstructionSetComputer,CISC)。
b)嵌入式微处理器分类
1.按照系列分:
ARM系列、MIPS系列、PowerPC系列。
2.按照指令复杂程度分:
CISC和RISC两类
2.微处理器划分:
a)嵌入式微控制器
b)嵌入式微处理器
c)DSP处理器
d)嵌入式片上系统
e)多核处理器
3.嵌入式操作系统(EOS)的特性
EOS除具备了一般操作系统最基本的任务调度、同步机制、中断处理、文件处理等功能外,还具有如下特点:
强实时性;支持开放性和可伸缩性的体系结构,具有可裁减性;提供统一的设备驱动接口;提供操作方便、简单、友好的图形GUI和图形界面;支持TCP/IP协议及其他协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,提供强大的网络功能。
第二章
1.ARM7TDMI命名
2.3级流水线与总线架构
三级流水线:
流水线使用3个阶段,因此指令分为3个阶段执行
1.取指:
从程序存储器中读取指令,放入流水线中
2.译码:
操作码和操作数被译码,决定执行什么功能,为下一个始终周期准备数据路径所需要的控制信号。
3.执行:
执行已译码的指令
注:
程序计数器(PC)指向被取指的指令,而不是指向正在执行的指令
在正常操作的过程中,在执行一条指令的同时对下一条指令进行译码,并将第三条指令从存储器中取出
3.ARM的两种状态与7种工作模式
a)两种状态。
i.ARM状态:
32位,这种状态下执行的是字方式的ARM指令;
ii.Thumb状态:
16位,这种状态下执行半字方式的Thumb指令。
注:
两个状态之间的切换并不影响处理器模式或寄存器内容,可以使用BX指令切换两种状态.状态寄存器CPSR的T位反应了处理器运行不同指令的当前状态.
b)7种工作模式。
注:
除用户模式外,其它模式均为特权模式。
ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。
此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。
题目:
ARM微处理器复位后,PC的地址通常是0x0,初始的工作模式是Supervisor
4.ARM常用几个寄存器功能
在ARM7TDMI处理器内部有37个用户可见的寄存器。
31个通用32位寄存器,6个状态寄存器。
a.堆栈寄存器(SP):
R13,在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都这样使用。
但是在Thumb指令集中存在使用R13的指令。
b.链接寄存器(LR):
R14,在结构上有两个特殊功能:
1.在每种模式下,模式自身的R14版本用于保存子程序返回地址;
2.当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
c.程序计数器(PC):
R15,在ARM状态,位[1:
0]为0,位[31:
2]保存PC。
在Thumb状态,位[0]为0,位[31:
1]保存PC。
对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8字节。
d.程序状态寄存器(CPSR):
R16,在所有处理器模式下都可以访问CPSR。
每种异常模式都有一个程序状态保存寄存器(SPSR),在异常发生时,SPSR用于保存CPSR的状态。
CPSR各位的含义及作用。
3130292827…876543210
NZCV(保留)IFTM4M3M2M1M0
5.条件代码标志
N运算结果的最高位反映在该标志位。
对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0;
Z指令结果为0时Z=1(通常表示比较结果“相等”),否则Z=0;
C当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0。
当进行减法运算(包括CMP指令),并且最高位产生借位时C=0,否则C=1。
对于结合移位操作的非加法/减法指令,C为从最高位最后移出的值,其它指令C通常不变;
V当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。
附:
控制位
I、F中断控制位——控制允许和禁止中断
T控制(标志)位——反映处理器的运行状态
M控制位——决定了处理器的运行模式
6.中断号、中断向量与优先级。
(7种异常)
7.存储器格式。
a)ARM体系结构使用232个字节的单一、线性地址空间。
将字节地址做为无符号数看待,范围为0~232-1
b)对于字对齐的地址A,地址空间规则要求如下:
●地址位于A的字由地址为A、A+1、A+2和A+3的字节组成;
●地址位于A的半字由地址为A和A+1的字节组成;
●地址位于A+2的半字由地址为A+2和A+3的字节组成;
●地址位于A的字由地址为A和A+2的半字组成。
注:
这样并不能完全定义字,半字和字节之间的映射。
存储器采用下列映射机制中的一种。
大端存储:
字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
小端存储:
低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节例如,假设一个32位字长的微处理器上定义一个int类型的常量a,其内存地址位于0x6000处,其值用十六进制表示为0x23456789。
如图1.2.2(a)所示,
如果按小端法存储,则其最低字节数据0x89存放在内存低地址0x6000处,最高字节数据0x23存放在内存高地址0x6003处。
如图1.2.2(b)所示,
如果按大端法存储,则其最高字节数据0x23存放在内存的低地址0x6000处,而最低字节数据0x89存放在内存的高地址0x6003处。
第三章
一:
寻址方式。
1.寄存器寻址
操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器的内容是操作数,指令执行时直接取出寄存器值操作。
例如指令:
MOVR1,R2;R1←R2
SUBR0,R1,R2;R0←R1-R2
2.立即寻址
在立即寻址指令中数据就包含在指令当中,立即寻址指令的操作码字段后面的地址码部分就是操作数本身,取出指令也就取出了可以立即使用的操作数(也称为立即数)。
立即数要以“#”为前缀,表示16进制数值时以“0x”表示。
SUBSR0,R0,#1;R0减1,结果放入R0,并且影响标志位
MOVR0,#0xFF000;将立即数0xFF000装入R0寄存器
3.寄存器移位寻址。
寄存器移位寻址是ARM指令集特有的寻址方式。
当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。
寄存器移位寻址指令举例如下:
MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,即是R0=R2×8
ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相“与”操作,结果放入R1
4.寄存器间接寻址
寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。
寄存器间接寻址指令举例如下:
LDRR1,[R2];将R2指向的存储单元的数据读出保存在R1中
SWPR1,R1,[R2];将寄存器R1的值和R2指定的存储单元的内容交换
5.基址寻址
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。
基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。
基址寻址指令举例如下:
LDRR2,[R3,#0x0C];读取R3+0x0C地址上的存储单元的内容,放入R2
STRR1,[R0,#-4]!
;先R0=R0-4,然后把R1的值寄存到保存到R0指定的存储单元
6.多寄存器寻址
多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。
多寄存器寻址指令举例如下:
LDMIAR1!
{R2-R7,R12};将R1指向的单元中的数据读出到R2~R7、R12中(R1自动加1)
STMIAR0!
{R2-R7,R12};将寄存器R2~R7、R12的值保存到R0指向的存储单元中R0自动加1
7.堆栈寻址
堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。
堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。
存储器堆栈可分为两种:
向上生长:
向高地址方向生长,称为递增堆栈
向下生长:
向低地址方向生长,称为递减堆栈
8.块拷贝寻址
多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。
如:
STMIAR0!
{R1-R7};将R1~R7的数据保存到存储器中。
;存储指针在保存第一个值之后增加,
;增长方向为向上增长。
STMIBR0!
{R1-R7};将R1~R7的数据保存到存储器中。
;存储指针在保存第一个值之前增加,
;增长方向为向上增长。
9.相对寻址
相对寻址是基址寻址的一种变通。
由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。
相对寻址指令举例如下:
BLSUBR1;调用到SUBR1子程序
BEQLOOP;条件跳转到LOOP标号处
...
LOOPMOVR6,#1
...
SUBR1...
二:
指令集(LDRSTRMOVADDSUB)
1.ARM指令集
2.Thumb指令集
3.常用指令
a)LDR:
加载字数据
b)STR:
存储字数据
LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。
地址偏移量有以下3种格式:
立即数。
立即数可以是一个无符号的数值。
这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。
如:
LDRR1,[R0,#0x12]
寄存器。
寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。
如:
LDRR1,[R0,R2]
寄存器及移位常数。
寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。
如:
LDRR1,[R0,R2,LSL#2]
从寻址方式的地址计算方法分,加载/存储指令有以下4种格式:
零偏移。
如:
LDRRd,[Rn]
前索引偏移。
如:
LDRRd,[Rn,#0x04]!
程序相对偏移。
如:
LDRRd,labe1
后索引偏移。
如:
LDRRd,[Rn],#0x04
c)MOV:
数据传送指令
d)ADD:
加法运算指令
e)SUB:
减法运算指令
第四章
一:
最小系统
一个嵌入式处理器自己是不能独立工作的,必须给它供电、加上时钟信号、提供复位信号,如果芯片没有片内程序存储器,则还要加上存储器系统,然后嵌入式处理器芯片才可能工作。
这些提供嵌入式处理器运行所必须的条件的电路与嵌入式处理器共同构成了这个嵌入式处理器的最小系统。
而大多数基于ARM7处理器核的微控制器都有调试接口,这部分在芯片实际工作时不是必需的,但因为这部分在开发时很重要,所以也把这部分也归入最小系统中。
二:
时钟产生单元
目前所有的微控制器均为时序电路,需要一个时钟信号才能工作,大多数微控制器具有晶体振荡器。
简单的方法是利用微控制器内部的晶体振荡器,但有些场合(如减少功耗、需要严格同步等情况)需要使用外部振荡源提供时钟信号。
三:
I2C的概念与应用
I2CBUS(InterIntegratedCircuitBUS,内部集成电路总线)是由Philips公司推出的二线制串行扩展总线,用于连接微控制器及其外围设备。
I2C总线是具备总线仲裁和高低速设备同步等功能的高性能多主机总线,直接用导线连接设备,通信时无需片选信号。
如图6.2.1所示,在I2C总线上,只需要两条线—串行数据SDA线和串行时钟SCL线,它们用于总线上器件之间的信息传递。
SDA和SCL都是双向的。
每个器件都有一个唯一的地址以供识别,而且各器件都可以作为一个发送器或接收器(由器件的功能决定)。
2C总线有如下操作模式:
主发送模式、主接收模式、从发送模式、从接收模式。
下面介绍其通用传输过程、信号及数据格式。
*数据有效:
在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变.
*起始停止
当I2C接口处于从模式时,要想数据传输,必须检测SDA线上的启动信号,启动信号由主器件产生。
如图6.2.2所示,在SCL信号为高时,SDA产生一个由高变低的电平变化,即产生一个启动信号。
当I2C总线上产生了启动信号后,那么这条总线就被发出启动信号的主器件占用了,变成“忙”状态;如图6.2.2所示,在SCL信号为高时,SDA产生一个由低变高的电平变化,产生停止信号。
停止信号也由主器件产生,作用是停止与某个从器件之间的数据传输。
当I2C总线上产生了一个停止信号后,那么在几个时钟周期之后总线就被释放,变成“闲”状态。
主器件产生一个启动信号后,它还会立即送出一个从地址,用来通知将与它进行数据通信的从器件。
1个字节的地址包括7位的地址信息和1位的传输方向指示位,如果第7位为“0”,表示马上要进行一个写操作;如果为“1”,表示马上要进行一个读操作。
*传输格式
SDA线上传输的每个字节长度都是8位,每次传输中字节的数量是没有限制的。
在起始条件后面的第一个字节是地址域,之后每个传输的字节后面都有一个应答(ACK)位。
传输中串行数据的MSB(字节的高位)首先发送。
*应答信号
为了完成1个字节的传输操作,接收器应该在接收完1个字节之后发送ACK位到发送器,告诉发送器,已经收到了这个字节。
ACK脉冲信号在SCL线上第9个时钟处发出(前面8个时钟完成1个字节的数据传输,SCL上的时钟都是由主器件产生的)。
当发送器要接收ACK脉冲时,应该释放SDA信号线,即将SDA置高。
接收器在接收完前面8位数据后,将SDA拉低。
发送器探测到SDA为低,就认为接收器成功接收了前面的8位数据。
*I2C总线的数据传输过程
①开始:
主设备产生启动信号,表明数据传输开始。
②地址:
主设备发送地址信息,包含7位的从设备地址和1位的数据方向指示位(读或写位,表示数据流的方向)。
③数据:
根据指示位,数据在主设备和从设备之间进行传输。
数据一般以8位传输,最重要的位放在前面;具体能传输多少量的数据并没有限制。
接收器产生1位的ACK(应答信号)表明收到了每个字节。
传输过
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM9 复习