位置:51电子网 » 技术资料 » 嵌入式系统

ARM7启动代码的分析与设计

发布时间:2009/2/16 0:00:00 访问次数:768

  引言

  随着生活水平的提高和it技术的进步,8位处理器的处理能力已经不能满足嵌入式系统的需要了;而16位处理器在性能和成本上都没有很大的突破。并且在8位机的开发中,大多使用汇编语言来编写用户程序。这使得程序的可维护性、易移植性等都受到了极大的挑战。正是基于此,arm公司适时的推出了一系列的32位嵌入式微控制器。目前广泛使用的是arm7和arm9系列,arm7tdmi内核的arm7处理器广泛应用于工业控制、仪器仪表、汽车电子、通讯、消费电子等嵌入式设备。本文主要以philips公司arm7tdmi核的lpc2119为例来分析如何编写arm7的启动代码。

  1、启动代码

  在嵌入式系统软件的开发中,应用程序通常是在嵌入式操作系统的开发平台上采用c语言编写的。然而,在arm系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率等,而这些过程都是针对arm内部寄存器结构的操作,用c语言编程是很难实现的。因此在转到应用程序的c/c++编写之前,需要用arm的汇编语言编写启动代码,由启动代码完成系统初始化以及跳转到用户c程序。在arm设计开发中,启动代码的编写是一个极重要的过程。然而启动代码随具体的目标系统和开发系统有所区别,但通常包含以下部分:

  ·向量表定义

  ·地址重映射及中断向量表的转移

  ·堆栈初始化

  ·设置系统时钟频率

  ·中断寄存器的初始化

  ·进入c应用程序

  下面就结合philips的lpc2119的启动代码来分析与说明arm7处理器的启动代码的编写。

  1.1向量表定义

  arm芯片上电或复位后,系统进入管理模式、arm状态、pc(r15)指向0x00000000地址处。中断向量表为每一个中断设置1个字的存储空间,存放一条跳转指令,通过这条指令使pc指针指向相应的中断服务程序入口,继而执行相应的中断处理程序。lpc2219的中断向量表和其它基于arm核的芯片中断向量表较类似,只要注意lpc2219要使向量表所有数据32位累加和为零(0x00000000-0x0000001c的8个字的机器码累加), 才能使用户的程序脱机运行。

  1.2 地址重映射及中断向量表的转移

  arm7处理器在复位后从地址0读取第一条指令并执行,因此系统上电后地址0必须是非易失的rom/flash,这样才能保证处理器有正确可用的指令。为了加快对中断的处理以及实现在不同操作系统模式下对中断的处理,这就需要重新映射中断向量表、bootblock和sram空间的一小部分。arm具有非常灵活的存储器地址分配特性。arm处理器的地址重映射机制有两种情况:

  ①由专门的寄存器完成重映射(remap),只需对相应的remap寄存器相应位设置即可。

  ②没有专门的remap控制寄存器需要重新改写用于控制存储器起始地址的块(bank)寄存器来实现remap。在lpc2119上的重映射,可以通过存储器映射控制器来实现。实现remap操作的程序实现如下:

  mov r8,#0x40000000; /设置新向量表起始地址/

  ldr r9,=interrupt_vector_table; /读原向量表源地址/

  ldmia r9!,(r0-r7); /复制中断向量表及中断处理程序的入口地址到ram中(64字节)/

  stmia r8!,(r0-r7)

  ldmia r9!,(r0-r7)

  stmia r8!,(r0-r7)

  ldr r8,=memmap ; /remmap操作/

  mov r9,#0x02

  str r9, [r8]

  1.3 堆栈初始化

  启动代码中各模式堆栈空间的设置是为中断处理和程序跳转时服务的。当系统响应中断或程序跳转时,需要将当前处理器的状态和部分重要参数保存在一段存储空间中,所以对每个模式都要进行堆栈初始化工作,给每个模式的sp定义一个堆栈基地址和堆栈的容量。堆栈的初始化有两种方法:第一种方法是结合ads开发套件中的分散加载文件来定义堆栈。第二种方法是最简单也是最常用的一种就是直接进入对应的处理器模式,为sp寄存器指定相应的值。下面给出了用第二种方法初始化管理模式和中断模式堆栈的程序:

  msr cpsr_c, #0xd3 ; /切换到管理模式,并初始化管理模式的堆栈/

  ldr sp, stack_svc

  msr cpsr_c, #0xd2 ; /切换到irq模式,并初始化irq模式的堆栈/

  ldr sp, stack_irq

  …

  1.4 系统部分时钟初始化

  时钟是芯片各部分正常工作的基础,应该在进入main()函数前设置。部分arm7片子内部集成有pll(锁相环)电路,用户可以用低频率的晶振通过pll电路获得一个较高频率的时钟。lpc2119内部的pll电路接受的输入时钟频率范围为10~25mhz,输入频率通过一个电流控制振荡器(cco)倍增到范围10~60mhz。同时为了使高速的arm处理器与低速的外设正常通讯和降低功耗(降低外设运行速度使功耗降低),lpc2119又集成了一个额外的分频器。pll的激活是由pllcon寄存器控制。pll倍频器和分频器的值由pllcfg寄存器控

  引言

  随着生活水平的提高和it技术的进步,8位处理器的处理能力已经不能满足嵌入式系统的需要了;而16位处理器在性能和成本上都没有很大的突破。并且在8位机的开发中,大多使用汇编语言来编写用户程序。这使得程序的可维护性、易移植性等都受到了极大的挑战。正是基于此,arm公司适时的推出了一系列的32位嵌入式微控制器。目前广泛使用的是arm7和arm9系列,arm7tdmi内核的arm7处理器广泛应用于工业控制、仪器仪表、汽车电子、通讯、消费电子等嵌入式设备。本文主要以philips公司arm7tdmi核的lpc2119为例来分析如何编写arm7的启动代码。

  1、启动代码

  在嵌入式系统软件的开发中,应用程序通常是在嵌入式操作系统的开发平台上采用c语言编写的。然而,在arm系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率等,而这些过程都是针对arm内部寄存器结构的操作,用c语言编程是很难实现的。因此在转到应用程序的c/c++编写之前,需要用arm的汇编语言编写启动代码,由启动代码完成系统初始化以及跳转到用户c程序。在arm设计开发中,启动代码的编写是一个极重要的过程。然而启动代码随具体的目标系统和开发系统有所区别,但通常包含以下部分:

  ·向量表定义

  ·地址重映射及中断向量表的转移

  ·堆栈初始化

  ·设置系统时钟频率

  ·中断寄存器的初始化

  ·进入c应用程序

  下面就结合philips的lpc2119的启动代码来分析与说明arm7处理器的启动代码的编写。

  1.1向量表定义

  arm芯片上电或复位后,系统进入管理模式、arm状态、pc(r15)指向0x00000000地址处。中断向量表为每一个中断设置1个字的存储空间,存放一条跳转指令,通过这条指令使pc指针指向相应的中断服务程序入口,继而执行相应的中断处理程序。lpc2219的中断向量表和其它基于arm核的芯片中断向量表较类似,只要注意lpc2219要使向量表所有数据32位累加和为零(0x00000000-0x0000001c的8个字的机器码累加), 才能使用户的程序脱机运行。

  1.2 地址重映射及中断向量表的转移

  arm7处理器在复位后从地址0读取第一条指令并执行,因此系统上电后地址0必须是非易失的rom/flash,这样才能保证处理器有正确可用的指令。为了加快对中断的处理以及实现在不同操作系统模式下对中断的处理,这就需要重新映射中断向量表、bootblock和sram空间的一小部分。arm具有非常灵活的存储器地址分配特性。arm处理器的地址重映射机制有两种情况:

  ①由专门的寄存器完成重映射(remap),只需对相应的remap寄存器相应位设置即可。

  ②没有专门的remap控制寄存器需要重新改写用于控制存储器起始地址的块(bank)寄存器来实现remap。在lpc2119上的重映射,可以通过存储器映射控制器来实现。实现remap操作的程序实现如下:

  mov r8,#0x40000000; /设置新向量表起始地址/

  ldr r9,=interrupt_vector_table; /读原向量表源地址/

  ldmia r9!,(r0-r7); /复制中断向量表及中断处理程序的入口地址到ram中(64字节)/

  stmia r8!,(r0-r7)

  ldmia r9!,(r0-r7)

  stmia r8!,(r0-r7)

  ldr r8,=memmap ; /remmap操作/

  mov r9,#0x02

  str r9, [r8]

  1.3 堆栈初始化

  启动代码中各模式堆栈空间的设置是为中断处理和程序跳转时服务的。当系统响应中断或程序跳转时,需要将当前处理器的状态和部分重要参数保存在一段存储空间中,所以对每个模式都要进行堆栈初始化工作,给每个模式的sp定义一个堆栈基地址和堆栈的容量。堆栈的初始化有两种方法:第一种方法是结合ads开发套件中的分散加载文件来定义堆栈。第二种方法是最简单也是最常用的一种就是直接进入对应的处理器模式,为sp寄存器指定相应的值。下面给出了用第二种方法初始化管理模式和中断模式堆栈的程序:

  msr cpsr_c, #0xd3 ; /切换到管理模式,并初始化管理模式的堆栈/

  ldr sp, stack_svc

  msr cpsr_c, #0xd2 ; /切换到irq模式,并初始化irq模式的堆栈/

  ldr sp, stack_irq

  …

  1.4 系统部分时钟初始化

  时钟是芯片各部分正常工作的基础,应该在进入main()函数前设置。部分arm7片子内部集成有pll(锁相环)电路,用户可以用低频率的晶振通过pll电路获得一个较高频率的时钟。lpc2119内部的pll电路接受的输入时钟频率范围为10~25mhz,输入频率通过一个电流控制振荡器(cco)倍增到范围10~60mhz。同时为了使高速的arm处理器与低速的外设正常通讯和降低功耗(降低外设运行速度使功耗降低),lpc2119又集成了一个额外的分频器。pll的激活是由pllcon寄存器控制。pll倍频器和分频器的值由pllcfg寄存器控

相关IC型号

热门点击

 

推荐技术资料

DFRobot—玩的就是
    如果说新车间的特点是“灵动”,FQPF12N60C那么... [详细]
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!