原创 初次认识ARM

2008-7-2 13:51 2063 0 1 分类: MCU/ 嵌入式
在最初接触ARM的时侯,觉得ARM非常的“异怪”,有很多东西和我们以前学的单片机不太一样,这里总结一下

1,非常多的通用寄存器
   ARM7TDMI内核中一共包括37个通用寄存器,这个与传统的CISC机器有非常大的区别,当然这也是ARM作为RISC处理器的一个非常重要的特征,寄存器多了就可以尽量减少对存储器的访问(比如传参,比如临时变量等等)。虽然在一个CPU状态下,我们能够看到的寄存器只有最多18个(r0~r15, CPSR,SPSR),但是ARM的寄存器堆确实较X86或者68K要多了不少。

2,没有硬件堆栈
   与我们以前学习的CISC机器不同,ARM的处理器本身在硬件上没有堆栈的概念。这麽说的意思是ARM本身在硬件上不会自己维护堆栈。比如在发生函数调用的时侯,返回地址是由硬件自动保存在R14寄存器中的,硬件不会将返回地址自动压栈。在中断或异常的时侯,硬件也只是将返回地址保存到R14,CPSR保存到相应状态的SPSR中。如果用户需要函数嵌套调用或是中断嵌套的话,必须自己通过软件管理自己的堆栈。

3,LD ST体系
   其实上面说的没有硬件堆栈适合这一条相关的,ARM是典型的Load Store体系架购,也就是说指令集中除了Load和Store指令是可以访问存储器的,其他所有指令的操作数都是存放在寄存器中的,如果CPU需要访存,必须采用Load或Store指令。硬件不会自己访问存储器,所以ARM也就没有硬件堆栈了,用户必须通过自己的软件中的Load Store指令才能够维护自己的堆栈。

4,多种CPU状态以及影子寄存器
   ARM 处理器有多达7个的处理器状态,其实这7个状态中,除了user 和 system 外的其他5个状态都是中断状态(比如IRQ和FIQ是硬件中断,Supervisor 是软件中断,Abort和Undef是异常)。与这7个状态相对应的,ARM在硬件上设计了每个状态专用的部分通用寄存器堆,比如IRQ状态下的R13,R14,SPSR;FIQ下的R8~R14, SPSR。我个人在最初学习ARM的时侯觉得这个所谓影子寄存器是非常不好理解的,后来想明白了,ARM的这样设计实际上是为了加快处理器在进行状态切换时不需要进行访存操作或是减少访存操作(主要是利用堆栈进行数据保存啦)

5,指令等长
   AMR的另外一个特点是不管在ARM状态还是Thumb状态所有的指令都是等长的,ARM状态下是32位,Thumb状态下是16位。这一点也是ARM作为RISC机器的一个非常重要的特点。

   现在用的久了,就觉得ARM是个功能强大的单片机,不过她可以跑实时操作系统的。
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1268540 2008-7-2 22:10

呵呵,不错~~
相关推荐阅读
用户160725 2008-08-04 09:50
嵌入式Linux文件系统详细介绍
Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtua...
用户160725 2008-07-31 13:33
嵌入式linux NFS配置
配置主机NFS服务主机IP:192.168.1.8编辑/etc/exports文件[linux@localhost ~]$ cat /etc/exports/appdata 192.168.1.*(r...
用户160725 2008-07-30 18:02
74HC/LS/HCT/F系列芯片的区别
1、 LS是低功耗肖特基,HC是高速COMS。LS的速度比HC略快。HCT输入输出与LS兼容,但是功耗低;F是高速肖特基电路;2、 LS是TTL电平,HC是COMS电平。3、 LS输入开路为高电平,H...
用户160725 2008-07-30 17:43
yaffs烧写
一个u-boot摆弄了好几天,终于能启动一切正常了,唯一缺点就是不能支持yaffs的烧写,看了很多文章还没有移植成功,没办法……只好用nfs复制了。压缩包内的是yaffs格式化工具(arm平台)和一个...
用户160725 2008-07-23 16:48
使用grep搜索文本文件
如果您要在几个文本文件中查找一字符串,可以使用grep命令。grep在文本中搜索指定的字符串。假设您正在/usr/src/linux/Documentation目录下搜索带字符串magic的文件:? ...
用户160725 2008-07-22 10:42
嵌入式linux根目录制作
(1)创建根文件系统的基本目录结构。把这个过程做成shell脚本(红色部分) ,在要建立根目录的地方运行即可。?#! /bin/sh? echo "creatint rootfs dir........
我要评论
1
0
关闭 站长推荐上一条 /1 下一条