位置:51电子网 » 技术资料 » 单 片 机

AT91系列微处理器启动过程的分析与实现

发布时间:2008/5/27 0:00:00 访问次数:625

  摘??? 要:本文讨论了arm启动的基本过程,详细分析了其中的remap过程和从加载时域到运行时域的转换这两个技术难点,给出了at91系列微处理器启动过程的具体实现方法。
  关键词:at91;remap;加载时域;运行时域;启动

引言
  在arm程序设计中,启动代码的编写是一个及其重要的过程,由于arm处理器的启动过程相对51单片机复杂,不仅要设置中断、初始化堆栈,还涉及到存储器的地址重映射以及重映射后中断地址的搬移、初始化主程序用到的存储区等问题,导致许多人对arm处理器的初始化以及启动代码的编写感到较为困难。本文详细分析了at91系列微处理器的启动过程。

系统存储介质和地址映射
  开发板的flash存储器采用atmel公司的at49bv1614a,板上采用的sram是issi公司的is61lv51216,at91m55800a片内还集成了8k字节的片内sram。flash存储器连接在at91m55800a的片选0引脚上,sram连接在片选1引脚上。上电时,flash映射地址为0x01000000,片内ram映射地址为0x00300000,片外sram不可见。

  系统上电时,从地址0开始读取上电复位中断处理程序,进行系统初始化。此时,地址0x00000000指向的是连接在片选0的存储器器件,所以要在片选0上连接flash。由于flash的运行速度相对ram要慢,且中断处理程序在flash中无法改动,所以,人们希望程序在ram中运行。为此,arm的cpu提供了remap命令来解决这个问题,当置位m55800a的重映射控制寄存器的重映射命令位(ebi_rcr的rcb位)后,内部ram就映射到地址0,配置ebi寄存器后,flash的地址是0x01000000,sram的地址是0x02000000。这就是系统的重映射过程。

启动过程的分析与实现
  一般而言,一个arm的启动代码必须要完成以下部分的初始化:定义入口点、设置中断/异常向量、初始化存储系统(如果需要,进行代码的搬移)、初始化堆栈、初始化i/o设备、初始化中断中用到的变量、开中断、必要时改变处理器的模式和处理器的状态、初始化c程序中用到的存储区、引导处理器进入c程序。其中的难点在于内存系统的重映射和对c程序用到的存储区进行初始化。

  (1)设置入口指针:启动程序首先必须定义入口指针,而且整个应用程序只有一个入口指针。

  (2)设置中断向量:arm7要求中断向量表必须设置在从0地址开始,连续8×4字节的空间,分别是复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、irq、fiq和一个保留的中断向量。由于flash在系统remap之前指向地址0,所以要在flash中安排中断向量。此时,真正有用的只有位于地址0的复位向量,在此安排一条 b? initreset指令,转向引导程序,其余中断未用。接下来在flash中构建一个新的中断向量表,用于在remap之后复制到片内ram中,采取相对寻址的方式。

  系统复位时,外部总线并没有被配置,此时片选0的总线等待周期是8,为了加速启动过程,可以在这时把片选0的总线等待周期设为与flash rom相应的数值。并且配置at91m55800的pll,使系统从慢晶振(32768hz)转到32mhz。
由于at91m55800a的irq和fiq中断是由先进中断控制器(aic)管理的,所以,要对aic进行配置。

  将刚才构建的中断向量表复制到位于0x300000的片内ram中,这样在remap后,重新映射到地址0的片内ram中就有了中断向量表。

  (3)进行remap。

  (4)初始化堆栈和寄存器:堆栈设置在at91m55800a的片内ram中,可以提高运行速度。系统堆栈初始化取决于用户使用了哪些中断,以及系统需要处理哪些错误类型。一般来说管理者堆栈必须设置,如果使用了irq中断,则irq堆栈也必须设置。进入相应的处理器模式,直接设置堆栈指针即可。

  (5)改变处理器模式、状态:对于不带操作系统的用户程序,系统可以处在user模式下;对于mc/os-ii,系统应当工作在svc模式下,否则无法完成任务的切换。

  (6)初始化c语言所需的存储器空间:拷贝程序到片外ram中,完成加载时域到运行时域的转换,初始化rw和zi段。

  (7)呼叫c程序:arm有16位thumb和32位arm两种指令集。使用16位的存储器可以降低成本, 在这种情况下,thumb指令集的整体执行速度比arm 32位指令集快,而且代码密度高,所以一般用thumb编译器将c语言程序编译成16位的代码。 处理器一开始总在arm状态,可使用bx指令转换到thumb状态呼叫c程序。

难点分析
remap
  在remap的过程中,存储器的地址改变时,pc指针并不会自动改变,因此,要保证remap以后程序能够继续运行下去,必须采取非正常跳转的手段,使pc指针指向remap后的程序地址,以下是实现remap过程的具体指令序列:
ldr????? r12, ptinitremap
;得到remap以后的跳转地址,存入r12
ldmia??? r10!,{r0-r9,r11}
;将ebi各个寄存器的设置值存入r0到r9和r11,其中r11指向ebi寄存器的基地址
stmia??? r11!, {r0-r9}
; 将r0到r9寄存器中的数值存入r11指向的ebi各个寄存器,进行remap
?mo

  摘??? 要:本文讨论了arm启动的基本过程,详细分析了其中的remap过程和从加载时域到运行时域的转换这两个技术难点,给出了at91系列微处理器启动过程的具体实现方法。
  关键词:at91;remap;加载时域;运行时域;启动

引言
  在arm程序设计中,启动代码的编写是一个及其重要的过程,由于arm处理器的启动过程相对51单片机复杂,不仅要设置中断、初始化堆栈,还涉及到存储器的地址重映射以及重映射后中断地址的搬移、初始化主程序用到的存储区等问题,导致许多人对arm处理器的初始化以及启动代码的编写感到较为困难。本文详细分析了at91系列微处理器的启动过程。

系统存储介质和地址映射
  开发板的flash存储器采用atmel公司的at49bv1614a,板上采用的sram是issi公司的is61lv51216,at91m55800a片内还集成了8k字节的片内sram。flash存储器连接在at91m55800a的片选0引脚上,sram连接在片选1引脚上。上电时,flash映射地址为0x01000000,片内ram映射地址为0x00300000,片外sram不可见。

  系统上电时,从地址0开始读取上电复位中断处理程序,进行系统初始化。此时,地址0x00000000指向的是连接在片选0的存储器器件,所以要在片选0上连接flash。由于flash的运行速度相对ram要慢,且中断处理程序在flash中无法改动,所以,人们希望程序在ram中运行。为此,arm的cpu提供了remap命令来解决这个问题,当置位m55800a的重映射控制寄存器的重映射命令位(ebi_rcr的rcb位)后,内部ram就映射到地址0,配置ebi寄存器后,flash的地址是0x01000000,sram的地址是0x02000000。这就是系统的重映射过程。

启动过程的分析与实现
  一般而言,一个arm的启动代码必须要完成以下部分的初始化:定义入口点、设置中断/异常向量、初始化存储系统(如果需要,进行代码的搬移)、初始化堆栈、初始化i/o设备、初始化中断中用到的变量、开中断、必要时改变处理器的模式和处理器的状态、初始化c程序中用到的存储区、引导处理器进入c程序。其中的难点在于内存系统的重映射和对c程序用到的存储区进行初始化。

  (1)设置入口指针:启动程序首先必须定义入口指针,而且整个应用程序只有一个入口指针。

  (2)设置中断向量:arm7要求中断向量表必须设置在从0地址开始,连续8×4字节的空间,分别是复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、irq、fiq和一个保留的中断向量。由于flash在系统remap之前指向地址0,所以要在flash中安排中断向量。此时,真正有用的只有位于地址0的复位向量,在此安排一条 b? initreset指令,转向引导程序,其余中断未用。接下来在flash中构建一个新的中断向量表,用于在remap之后复制到片内ram中,采取相对寻址的方式。

  系统复位时,外部总线并没有被配置,此时片选0的总线等待周期是8,为了加速启动过程,可以在这时把片选0的总线等待周期设为与flash rom相应的数值。并且配置at91m55800的pll,使系统从慢晶振(32768hz)转到32mhz。
由于at91m55800a的irq和fiq中断是由先进中断控制器(aic)管理的,所以,要对aic进行配置。

  将刚才构建的中断向量表复制到位于0x300000的片内ram中,这样在remap后,重新映射到地址0的片内ram中就有了中断向量表。

  (3)进行remap。

  (4)初始化堆栈和寄存器:堆栈设置在at91m55800a的片内ram中,可以提高运行速度。系统堆栈初始化取决于用户使用了哪些中断,以及系统需要处理哪些错误类型。一般来说管理者堆栈必须设置,如果使用了irq中断,则irq堆栈也必须设置。进入相应的处理器模式,直接设置堆栈指针即可。

  (5)改变处理器模式、状态:对于不带操作系统的用户程序,系统可以处在user模式下;对于mc/os-ii,系统应当工作在svc模式下,否则无法完成任务的切换。

  (6)初始化c语言所需的存储器空间:拷贝程序到片外ram中,完成加载时域到运行时域的转换,初始化rw和zi段。

  (7)呼叫c程序:arm有16位thumb和32位arm两种指令集。使用16位的存储器可以降低成本, 在这种情况下,thumb指令集的整体执行速度比arm 32位指令集快,而且代码密度高,所以一般用thumb编译器将c语言程序编译成16位的代码。 处理器一开始总在arm状态,可使用bx指令转换到thumb状态呼叫c程序。

难点分析
remap
  在remap的过程中,存储器的地址改变时,pc指针并不会自动改变,因此,要保证remap以后程序能够继续运行下去,必须采取非正常跳转的手段,使pc指针指向remap后的程序地址,以下是实现remap过程的具体指令序列:
ldr????? r12, ptinitremap
;得到remap以后的跳转地址,存入r12
ldmia??? r10!,{r0-r9,r11}
;将ebi各个寄存器的设置值存入r0到r9和r11,其中r11指向ebi寄存器的基地址
stmia??? r11!, {r0-r9}
; 将r0到r9寄存器中的数值存入r11指向的ebi各个寄存器,进行remap
?mo

相关IC型号

热门点击

 

推荐技术资料

硬盘式MP3播放器终级改
    一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!