163博客迁移!
简介
ARM是一家公司,该公司不生成芯片,也不销售芯片,只出售芯片技术授权!因此ARM只是一种技术,ARM技术无处不在!
本质上来说ARM具有RISC的特点:大量的存储器、通过load/store的体系结构在内存和寄存器之间传递数据、寻址方式简单、采用固定长度的指令格式....
我是从51过渡而来的,写过51汇编的都知道51寄存器的相关设置,不过ARM更加多,寄存器更丰富!
数字处理器DSP/FPGA用的好就是一个专用的处理器,但是这些需要使用的是逻辑语言VHDL,本质是最高级的编程,因为这个就是直接对信号进行处理,例如:AD转换后数据输出----FIFO预存取----DSP依据时序进行处理----输出结果!只是因为DSP成本相对比较高,并且单一性比较强,而且如果是复杂系统的话,那么开发周期太长!不像51,AVR,ARM整体性价比高,而且容易学习和系统掌握,极大的缩短了复杂系统的开发时间!
因此大多数,我们需要使用ARM处理器,是带有寄存器算法以及相应的结构 ,能够对利用C或汇编写成的二进制代码存储在内存当中的,依据ARM指令来进行处理操作的一种处理器,这个就是和DSP的最本质的区别!
MX27属于ARM9E系列处理器.
ARM处理器模式
ARM处理器有7种模式:
用户模式(User,usr) 正常程序执行的模式
快速中断模式(FIQ,fiq) 用于高速数据传输和通道处理
外部中断处理(IRQ,irq) 用于通常的中断处理
特权模式(sve) 这个是用于操作系统使用的一种保护模式,特别是临界区的崩溃
数据访问终止模式(abort,abt ) 这个用于虚拟存储和存储保护,MMU存储管理
未定义指令终止模式(undefined ,und) 用于支持通过软件方针硬件的协处理器
系统模式(system,sys ) 用于运行特权级的操作系统任务
寄存器R0--R14,R15=PC(程序计数器)是通用寄存器,R0-R7,PC和CSPR这几个寄存器上面的7种模式都可以使用,然后有些模式下拥有自己独立的物理寄存器,例如:R13_irq, R13_fiq,R13_und,R13_abt,R13_svc这些都是对应上面特定模式下的独立的物理寄存器,因此ARM一共有37个寄存器。
寄存器方面:
R0-R7 ---表示未备份寄存器,由于不同的处理器模式使用相同的物理寄存器,因此可能会造成寄存器中数据的破坏
R8-R12 ---备份寄存器,每个寄存器都对应两个不同的物理寄存器,系统可以初始化该寄存器,使得出现异常模式的时候利用该寄存器指向专用的栈地址来进行处理,例如R13--栈寄存器,当进入到异常模式时,可以将需要使用的寄存器保存在R13所指向的栈中,当退出时,将保存在R13所指向栈中的寄存器值恢复,这样就使得异常处理程序不会破坏被自己中断程序的运行现场!
R14,连接寄存器,每一种处理器模式在自己的物理R14寄存器中存放了当前子程序的返回地址。也就是说R14被设置成了子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回!例如
MOV PC,LR或者是BX LR
R15,程序计数器,PC,当读取PC的时候,那么PC的值就直接加8,即指向下两条指令的地址。当成功的向R15中写入一个地址数值时,程序将跳转到该地址执行!
CPSR(Current Program Status Register,当前程序状态寄存器),故名思义,该寄存器可以读出:当前处理器模式标志、中断禁止位、条件标志位等等还有其它的一些控制和状态位。有很多指令会对该寄存器产生影响:例如:比较指令:CMP、CMN、TEQ等,算术和逻辑运算,MSR可以直接改变该寄存器内容,例如可以设置中断禁止位来禁止IRQ中断或者是FIQ中断等等
SPSR(Saved Program Status Register,备份的程序状态寄存器),用于在特定的异常中断的时候,保存被中断的程序的程序状态CSPR,以便在返回的时候,将其加载给CPSR,但是用户模式和系统模式不是异常中断,所以没有SPSR!
指令方面:
ARM体系有三种方式控制程序的执行流程:
1.正常情况下,通过程序计数器PC的值增加4个字节,也就是下一个地址,来执行一条ARM指令,顺序执行
2.通过跳转指令,程序可以跳转到特定的地点标号执行
3.通过异常中断,根据相关的寄存器,跳转到相应的异常中断处理程序处执行,完成后要返回到发生中断的指令下一条指令执行,也就是PC+4处执行。
增加了指令MRS和指令MSR,用于访问CPSR和SPSR寄存器。
Thumb状态切换指令,该状态时候表示所用的指令集合都是16位的Thumb指令集.其实该状态我觉得没什么特别的意义,书上介绍的是Thumb指令集是ARM指令集的一个子集重新编码而形成的一个指令集,该处理长度为16位。这样,使用Thumb指令集可以得到密度更高的代码,对需要严格控制产品成本的设计比较有意义,但是thumb又没有包含进行异常处理 时需要的指令,因此在异常中断的低级处理时,还是需要使用ARM指令!
跳转指令: B指令执行跳转操作
BL执行跳转的同时,保存子程序的返回地址。
BX指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态
BLX指令执行3个操作,跳转目标地址执行,保存子程序的返回地址,切换程序状态到Thumb状态
LDR指令格式,该指令主要用于从内存中将一个字的数据传送到寄存器中。
常见部分指令:
MOV R3,R2 -----将R2的数值放到R3中
ADD R0,R1,R2 ------R0数值等于R1的数值加上R2的数值
MOV R0,R1,LSL ,#3 ------LSL是逻辑左移,也就是说将R1逻辑左移3位,也就是R1乘以2的3次方,将结果的值赋值给R0
SUB R0,R1,R2,LSL #4 ------R0 =R1 - R2/2**4 ,也就是说R2除以16,然后R0=R1-R2
MOV R0,R1,ROR R2 ---------R0=R1循环右移R2位
MOV R0,#0xFC0 ----直接令R0的数值为0xFC0
LDR R0,[R1,R2] ------将内存单元R1+R2地址中的字读取到R0寄存器中,注意[ ]相当于51汇编的间接取值,也就是先取地址,然后再取该地址内的值。
LDR R0,[R1,-R2] ------将内存单元R1-R2地址中的字读取到R0寄存器中
LDR R0,[R1,R2,LSL #2 ] ------R2 * 4+R1地址中的数据读取到R0中
LDR R0 ,[R1,R2] ! -----将内存单元R1+R2地址中的字值给R0,然后更新R1=R1+R2 ,这里的 ! 表示更新基址寄存器的值
ARM的中断处理种类
51是非常简单的,直接定义好相关的中断向量表即可,利用interrupt 1 use 0来定义中断处理函数
但是ARM中断有几种中断模式,除了用户模式和系统模式,其余的就是异常中断模式。
首先需要大致的明白一下指令操作的过程的意思,ARM9E是五级流水线,也就是说同时获取5条指令一起按序执行,提高效率,指令根据程序计数器PC+4从有效地址中获取,然后运行,保存相关的数据进入寄存器,因此指令有预存,数据访问等等多种指令,下面的中断就是提供处理
复位中断(reset) -----当处理器的复位引脚有效时,系统跳到复位异常中断处理程序执行,也就是reboot!
未定义的指令(und)----当ARM处理器或者是系统中的协处理器认为当前指令未定义时,会产生R13_und,R14_und中断,可以利用该中断指向其它的特权模式下的操作指令,这样就能够实现系统功能调用。也即是系统软中断。
指令预存终止(abort)-----如果处理器预存的指令地址不存在了,那么会产生该中断,需要定义进行处理。
数据访问中止(da
外部中断请求(irq) ---这个中断就是外部引脚中断,和51一样,只要使能了就可以使用了
快速中断请求(Fiq)---和上面一样,只是该引脚属于特殊响应脚,速度上有要求
ARM体系的存储系统
ARM的存储空间----ARM使用单一的平板地址空间,可以看做是2的32次个 8bit的大小,也就是说是2的32次幂个字节大小,每个字节包含了8位bit ;或者也可看成是2的30次个 32bit的大小空间,也就是说字节地址为A的数据包含了A,A+1.A+2.A+3个字节单元的内容,这些字节单元的地址被4整除,表示32位的地址,thumb是16位的半字单元!
和51的区别就是,51就是8位的,单个字节的设置!
OK!那么这样的话,我们可以说一下,大端小端的区别了,很多人经常都弄不明白,其实就是上面一个32位字单元的排序问题,我们如果取一个32位的地址数据,那么我们总要有个规定来定义该数据那个是高位,那个是低位,因此出现大小端的定义:
little-endian: 小端----地址为A的字单元包含的字节单元是:A,A+1,A+2,A+3,那么规定高位到低位的数据是A+3,A+2,A+1, A,最后取出来的是高位,因此数据是相当于将51获取的8位地址数据进行左移的操作!
big-endian:大端 ---这个就不说了,刚好和上述的相反!