学习ARM,首先要对ARM有个大体宏观的了解!这样后边学起来也会更轻松一些!
常用熟悉的一般分为:
1. 芯片:6410 210 2440 (这三款都是三星的)
2. ARM核:arm11 A8 arm9
3. 指令架构:armv7 armv6
首先ARM大家族的一些名词:
上面的图简化一下就是ARM内部之间的一些区分:
下面简单的看一下S3C2440芯片的架构图:
从上面芯片架构图中可以看出有一部分是ARM9TDMI (processor core)芯片的核,这一部分就是ARM9的核,这样就把芯片和ARM核联系起来了!
同理6410上可以看出是ARM11的核,210上用的是cotexA8的核。
下面再来看看ARM核和ARM指令架构的关系!从S3C2440 ARM核手册上可以查到这样一段话
可以看到S3C2440用的ARM9的核采用的是ARMV4T(其中v4 代表versions4),即采用的是ARMV4指令架构
同理同样的方法也可以查阅ARM11的核采用的是ARMV6T指令架构版本,A8的核采用的ARMV7的指令架构!
在一个芯片中最重要的就是ARM核了!下面就来了解ARM核的相关知识!
cortex-M系列大多用于工控,其实就是单片机,不过比单片机性能要牛逼那么一点!
cortex-R系列一般用于实时性要求很强的应用!
cortex-A系列多用于多媒体应用,比如我们用到的手机等高端一点的嵌入式设备!
不同芯片之间的一些比较重要的对比参数:
1. 处理速度(一般指通过配置在一个范围内可选的速度范围)
2. 缓存
3. 内存接口(支持什么内存直接决定芯片的性能)
4. 支持的OS
5. 其他
这些信息基本上都要查阅芯片手册datasheet,这里也就不一个一个的截图了!这里记个笔记大脑中有个大概的概念!
这里只简要介绍一下自己用的开发板OK6410:
处理速度:533~667MHZ
缓存:16kb
内存接口:SDRAM和DDR(DDR性能比SDRAM强很多)
支持的OS:wince/linux/android
其他:2440已结停产了 6410还在生产(工作和学习时可综合考虑),就学习来说,个人认为刚开始学的时候最好还是选2440资料多还全!非常适合初学ARM的人!自学的话找到方法只要自己努力完全没问题!
ARM处理器的工作模式:
ARM官方宝典:ARM Architecture Reference Manual手册, 这个手册在后边的学习中也会经常用到!总之是一个very important datasheet
ARM的七种工作模式截图:(记得当初面试的时候有被问到,当然这只是个很基础的问题)
这里先简要说一下在不同的工作模式下有何区别:比如当一个程序运行在不同的模式下面的时候,能够运行的ARM处理器的指令是不一样的,能够访问的ARM处理器的寄存器都是不一样的!
User: 普通用户模式
FIQ: 快速中断模式
IRQ: 普通中断模式
Supervisor:保护模式(权限相对比较高)
Abort:异常模式 (比如程序访问出现异常)
Undefined:未定义模式(比如使用了一条未定义的汇编指令)
System:系统模式(在ARMV4以上才有的模式, 用的很少)
对于Linux而言,一般的应用程序运行在User模式,而Linux内核运行在SVC模式,即Supervisor模式(面试时可能被问到)
下面来进行ARM寄存器详解:
首先还是来张图看个大概!这个还是根据上面的ARM宝典官方datesheet来的,对A8, 6410,2440都通用,而这些对于学习底层编程来说这些寄存器大部分都会用到!总之脑子里面最起码要有个大概!
The ARM processor has a total of 37 registers;(也是很基础的,面试可能问到)
下面来段详细点的datesheet手册截图:
翻译总一下:
ARM微处理器公有37个32位寄存器,其中31个为通用寄存器,6个位状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决于ARM处理器的工作状态及具体的运行模式。但是在任何时候,通用寄存器R14-R0、程序计数器PC、一个状态寄存器都是可以访问的。
ARM寄存器一览图:
通用寄存器被分为三类:
不分组通用寄存器:
R0-R7是不分组的寄存器。这意味着在所有处理器模式下,访问的都是同一个物理寄存器。不分组寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器。
分组寄存器:
看到这些寄存器是不是感觉和学C语言时看到的SP指针 、还有学汇编时理解中断工作原理很熟悉!没错就是他!
程序计数器:
寄存器R15被用做程序计数器,也称为PC,其值等于当前正在执行的指令地址+8(因为在取址和执行之间多了一个译码的阶段)
程序状态寄存器:
1. CPSR
2. SPSR_svc(SPSR 中的S可以理解为save,这个如果理解中断工作模式的话就很好理解了)
3. SPSR_abt
4. SPSR_und
5. SPSR_irq
6. SPSR_fiq
CPSR在每种异常模式下都有一个对应的物理寄存器---程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的值,以便在异常返回后恢复异常发生时的工作状态。
ARM所有工作模式下都可以访问程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息!稍微有点小复杂!记得第一次学的时候还在纸上把每一位标出来各种不同的值代表的含义!很费劲!现在也忘的差不多了!
这里简单的截图介绍一下!后边的程序中会用到!
CPSR/SPSR寄存器中比较重要的几位:
ARM寻址方式(这里简要介绍几种常用的寻址方式):
所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式
1. 立即数寻址
2. 寄存器寻址
3. 寄存器间接寻址
4. 基址变址寻址
5. 相对寻址