资料介绍
13.5 复位和初始化
任何运行在实际硬件上的嵌入式应用程序,都必须在启动时实现一些基本的系统初始化。本节将对此予以详细讨论。
13.5.1 初始化序列
图13.14显示了一个适用于ARM嵌入式系统的初始化序列。
图13.14 ARM嵌入式系统的初始化序列
系统启动时立即执行复位处理程序,然后进入$Sub$$main()的代码执行。
复位处理程序是用汇编语言编写的代码块,它在系统复位时执行,完成系统初始化操作。对于具有局部存储器的内核,如Caches、紧密藕荷存储器(TCM)、存储管理单元(MMU)和存储器保护单元(MPU)等,在初始化过程这一阶段完成必要的配置。复位处理程序在执行之后,通常跳转到__main以开始C库的初始化序列。
13.5.2 向量表
所有的ARM系统都有一个向量表(vector table)。向量表不是初始化序列的一部分,但是对每个要处理的异常,它必须存在。这些地址通常包含以下形式的跳转指令。
· B《address》:该条指令实现了相对于pc的跳转
· LDR pc,[pc,offset]:这条指令将异常处理程序的入口地址从存储器装载到pc。该地址是一个32位的绝对地址。由于有额外的存储器访问,装载跳转地址会使分支跳转到特定处理程序,给系统执行带来延时。不过,可以使用这种方法跳转到存储空间内的任意地址。
· MOV pc,#immediate:将一个立即数复制到pc。使用该指令可以跨越整个地址空间,但是受到地址对齐问题的限制。这个地址必须由8位立即数循环右移偶数次得到。
另外,也可以在向量表中使用其他类型的指令。例如,FIQ处理程序可以从地址0x1c处开始执行。因为它位于向量表的最后,这样FIQ处理程序就可以不用跳转,立即从FIQ向量地址处开始执行。
下面的例子显示了一个使用LDR指令的向量表装载过程。
;**********************************
;* VECTOR TABLE *
;**********************************
AREA vectors, CODE
ENTRY
; 定义标准的ARM向量表
INT_Vectors
LDR PC, INT_Reset_Addr
LDR PC, INT_Undef_Addr
LDR PC, INT_Software_Addr
LDR PC, INT_Prefetch_Addr
LDR PC, INT_Data_Addr
LDR PC, INT_Reserved_Addr
LDR PC, INT_IRQ_Addr
LDR PC, INT_FIQ_Addr
在向量表的入口处要有ENTRY标识。该标识通知链接程序该代码是一个可能的入口点,因而在链接时,不能被清除。
13.5.3 ROM/RAM重映射
启动时,0x0处必须要有一条有效指令,因此,复位时0x0000地址必须为非易失性存储器,如ROM或FLASH。
注意有些系统是从0xffff0000处开始执行的,对于这样的系统,地址0xffff0000处必须为非易失性存储器。
可以将ROM定位在0x0处。但是,这样配置有几个缺点。首先ROM存取速度通常较RAM要慢,当跳转到异常处理程序时,系统性能可能会大受影响。其次,将向量表放于ROM中,运行时不能修改。
存储器地址重映射(Memory Remap)是当前很多先进控制器所具有的功能。所谓地址重映射就是可以通过软件配置来改变存储器物理地址的一种机制或方法。
当一段程序对运行自己得存储器进行重映射时,需要特别注意保证程序执行流程在重映射前后的承接关系。实现重映射的关键就是要使程序指针在remap以后能继续往下得到正确的指令。本书中介绍两种实现重映射的机制,不同的系统可能会有多种灵活的remap方案,用户在具体实现时要具体分析。
1.先搬移后映射(Remap after Copy)
图13.15显示一种典型的存储器地址重映射情况。
图13.15 ROM/RAM重映射(1)
原来RAM和ROM各有自己的地址,进行重映射以后RAM和ROM的地址都发生了变化。这种情况下,可以采用以下方案。
① 上电后,从0x0地址的ROM开始往下执行。
② 根据映射前的地址,对RAM进行必要的代码和数据拷贝。
③ 拷贝完后,进行remap操作。
④ 因为RAM在remap前准备好了内容,使得PC指针能继续在RAM里取到正确的指令。
任何运行在实际硬件上的嵌入式应用程序,都必须在启动时实现一些基本的系统初始化。本节将对此予以详细讨论。
13.5.1 初始化序列
图13.14显示了一个适用于ARM嵌入式系统的初始化序列。
图13.14 ARM嵌入式系统的初始化序列
系统启动时立即执行复位处理程序,然后进入$Sub$$main()的代码执行。
复位处理程序是用汇编语言编写的代码块,它在系统复位时执行,完成系统初始化操作。对于具有局部存储器的内核,如Caches、紧密藕荷存储器(TCM)、存储管理单元(MMU)和存储器保护单元(MPU)等,在初始化过程这一阶段完成必要的配置。复位处理程序在执行之后,通常跳转到__main以开始C库的初始化序列。
13.5.2 向量表
所有的ARM系统都有一个向量表(vector table)。向量表不是初始化序列的一部分,但是对每个要处理的异常,它必须存在。这些地址通常包含以下形式的跳转指令。
· B《address》:该条指令实现了相对于pc的跳转
· LDR pc,[pc,offset]:这条指令将异常处理程序的入口地址从存储器装载到pc。该地址是一个32位的绝对地址。由于有额外的存储器访问,装载跳转地址会使分支跳转到特定处理程序,给系统执行带来延时。不过,可以使用这种方法跳转到存储空间内的任意地址。
· MOV pc,#immediate:将一个立即数复制到pc。使用该指令可以跨越整个地址空间,但是受到地址对齐问题的限制。这个地址必须由8位立即数循环右移偶数次得到。
另外,也可以在向量表中使用其他类型的指令。例如,FIQ处理程序可以从地址0x1c处开始执行。因为它位于向量表的最后,这样FIQ处理程序就可以不用跳转,立即从FIQ向量地址处开始执行。
下面的例子显示了一个使用LDR指令的向量表装载过程。
;**********************************
;* VECTOR TABLE *
;**********************************
AREA vectors, CODE
ENTRY
; 定义标准的ARM向量表
INT_Vectors
LDR PC, INT_Reset_Addr
LDR PC, INT_Undef_Addr
LDR PC, INT_Software_Addr
LDR PC, INT_Prefetch_Addr
LDR PC, INT_Data_Addr
LDR PC, INT_Reserved_Addr
LDR PC, INT_IRQ_Addr
LDR PC, INT_FIQ_Addr
在向量表的入口处要有ENTRY标识。该标识通知链接程序该代码是一个可能的入口点,因而在链接时,不能被清除。
13.5.3 ROM/RAM重映射
启动时,0x0处必须要有一条有效指令,因此,复位时0x0000地址必须为非易失性存储器,如ROM或FLASH。
注意有些系统是从0xffff0000处开始执行的,对于这样的系统,地址0xffff0000处必须为非易失性存储器。
可以将ROM定位在0x0处。但是,这样配置有几个缺点。首先ROM存取速度通常较RAM要慢,当跳转到异常处理程序时,系统性能可能会大受影响。其次,将向量表放于ROM中,运行时不能修改。
存储器地址重映射(Memory Remap)是当前很多先进控制器所具有的功能。所谓地址重映射就是可以通过软件配置来改变存储器物理地址的一种机制或方法。
当一段程序对运行自己得存储器进行重映射时,需要特别注意保证程序执行流程在重映射前后的承接关系。实现重映射的关键就是要使程序指针在remap以后能继续往下得到正确的指令。本书中介绍两种实现重映射的机制,不同的系统可能会有多种灵活的remap方案,用户在具体实现时要具体分析。
1.先搬移后映射(Remap after Copy)
图13.15显示一种典型的存储器地址重映射情况。
图13.15 ROM/RAM重映射(1)
原来RAM和ROM各有自己的地址,进行重映射以后RAM和ROM的地址都发生了变化。这种情况下,可以采用以下方案。
① 上电后,从0x0地址的ROM开始往下执行。
② 根据映射前的地址,对RAM进行必要的代码和数据拷贝。
③ 拷贝完后,进行remap操作。
④ 因为RAM在remap前准备好了内容,使得PC指针能继续在RAM里取到正确的指令。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 嵌入式开发 ---必看图书
- python做嵌入式开发_Python和嵌入式的区别是什么?可以做嵌入式开发吗?
- 嵌入式开发
- 嵌入式开发资料免费分享
- 嵌入式开发(一):嵌入式开发新手入门
- 根据MATLAB中的伪随机交织器产生的交织图案初始化到ROM的实验
- AI开发平台如何帮助嵌入式开发者加速应用产品化落地 0次下载
- 嵌入式开发教程之SCPI命令参考的详细资料说明 38次下载
- 如何快速熟练掌握嵌入式开发嵌入式开发工程师需要做哪些事情
- 如何使用ARM进行嵌入式系统设计详细方法研究 9次下载
- 嵌入式开发要学什么嵌入式开发的一些入门教材推荐 27次下载
- 嵌入式开发Linux网络编程培训资料的详细资料免费下载 34次下载
- 嵌入式开发中固件的详细烧录方式 14次下载
- 基于ARM的嵌入式开发
- 嵌入式开发圣经
- STM32嵌入式开发中的RTOS,你用过哪些? 1683次阅读
- 复位电路如何回到初始化的状态 1110次阅读
- 嵌入式开发中串口通讯方案 2249次阅读
- 嵌入式开发的产品有哪些_嵌入式开发的流程 1w次阅读
- 基于Mac上做嵌入式开发简析 3829次阅读
- 在Nios II平台下搭建RTEMS嵌入式开发简析 1510次阅读
- 嵌入式开发好学吗_嵌入式开发职业发展方向是什么 8950次阅读
- 什么是嵌入式开发板_学嵌入式用什么开发板 6944次阅读
- 嵌入式开发和单片机开发有什么区别和联系 3.5w次阅读
- 嵌入式C实现延时程序的不同变量的区别 几种Linux嵌入式开发环境的简单介绍 1566次阅读
- 嵌入式开发工具有哪些_五款嵌入式开发工具推荐 4w次阅读
- 学嵌入式开发入门_学嵌入式开发需要看哪些书籍 2.4w次阅读
- 嵌入式开发环境的搭建 8304次阅读
- 嵌入式开发就业前景分析_嵌入式领域的职业发展方向 1.8w次阅读
- 嵌入式开发职业发展四大方向 1.1w次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多