Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1347353
  • 博文数量: 206
  • 博客积分: 10571
  • 博客等级: 上将
  • 技术积分: 2610
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-30 11:50
文章分类
文章存档

2014年(1)

2013年(4)

2012年(18)

2010年(14)

2009年(31)

2008年(3)

2007年(135)

分类: LINUX

2007-06-11 22:40:59

                  ARM7启动过程

启动程序一般流程如下:

  (1) 设置入口指针

  (2) 设置中断向量
 
  ARM7要求中断向量必须设置从0地址开始,连续8*4字节的空间,分别是复位、未定义指令错误、软件中断、预取指令中断、数据存取错误、IRQ、FIQ和一个保留的中断向量

  (如果ROM位于0地址,向量表包含一系列指令跳转到中断服务程序,否则向量必须被动态初始化。可以在启动程序中添加一段代码,使其在运行时将向量表拷贝到0地址开始的存储空间)

  对于各未用的中断,用一个只包含返回指令的哑函数,以防止错误引起系统的混乱。

  (3) 初始化堆栈和寄存器

  取决于使用了哪些中断,一般系统需要处理哪些错误类型。一般来说管理者堆栈必须设置,如果使用了IRQ中断,则IRQ堆栈必须设置。

  如果系统使用了DRAM或者其他的外设,则需要设置相关的寄存器,以确定其刷新频率,数据总线宽度等信息

  (4) 初始化存储器系统

  有些芯片可通过寄存器编程初始化存储器系统,而对于复杂系统通常集成了MMU来管理内存

  (5) 如果有必要改变处理器模式、状态

  如果系统应用程序是运行在用户模式下,可在此处将系统改为用户模式并初始化用户的堆栈指针。

  (6) 初始化C语言所需要的存储器空间

  为正确运行应用程序,在初始化期间应将系统需要读写的数据和变量从ROM拷贝到RAM里;一些要求快速响应的程序,如中断处理程序,也需要在RAM中运行; 如果使用FLASH,对FALSH的檫除和写入也一定要在RAM里运行。ARM公司软件开发工具包中的链接器提供了分布装载的功能,可以实现这一目的。

  (7) 呼叫C语言

  ARM有两种指令集:16位的Thumb指令集和32位的指令集。使用16位的存储器可以降低成本,在这种情况下,Thumb指令集的整体执行速度要比ARM32位指令集体,而且提高了代码密度,所以一般用Thumb 编译器将C语言 程序编译成16位代码。

  处理器在一开始总是处于ARM状态,可使用BX指令转换到Thumb状态呼唤C语言程序,要注意的是用C语言编写的嵌入式程序时,要避免使用不能被固化到ROM的库函数。

  技术难点分析

  (1) MMU的使用

  MMU 是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU通常是CPU的一部分,本身有少量的存储空间存放从虚拟地址到物理地址的匹配表。此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由MMU决定数据只在RAM中还是在大容量的存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断

  MMU的两个主要功能是:

  将虚拟地址转换为物理地址

  控制存储器存取允许。MMU关掉时,虚地址直接输出到物理地址总线。

  在实践中,使用MMU解决了以下几个问题:

  a. 使用DRAM作为大容量存储器时,如果DRAM行列是非平方的,会导致该DRAM的物理地址不连续,这将给程序的编写调试造成极大的不方便,而适当的配置MMU可将其转换成虚拟地址连续的空间

  b. ARM内核的中断向量表放在0地址,对于ROM在0地址的情况,无法调用中断服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。

  c. 系统的某些地址是不允许被访问的,否则会产生不可预料的后果,为避免这类错误,可以通过MMU匹配表的设置将这些地址设为用户不可以存取类型;

  d. 启动程序中生成的匹配表中包含地址映射,存储页面大小(1M、64K 或者4K)以及是否允许存取等信息。

阅读(1455) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-04-04 14:47:01

学习了,多谢楼主分享哦!也欢迎广大linux爱好者来我的论坛一起讨论arm哦!www.lt-net.cn