-
ARM
启动及工作模式切换
一、原理
如何让嵌入式系统快速稳定地启动
是一个重要问题。嵌入式系统的资源有限,程序通常都是
固化在
ROM
中运行。但在实际应用中,为提高系统的实时性,加快代码的执行速度,系统启
动后程
序往往要被搬移到
RAM
中,因为
RAM
的存取速度要比
ROM
快得多,这样
大大提升系统的性能。启动
程序要完成的任务包括:硬件初始化,系统存储系统的配置,
复制二级中断向量表。
二、启动程序过程
●
系统硬件初始化
系统上电或复位后,程序从位于地址
0x0
的
Reset
Exception
Vector
处开始执行,因此需要在这里
< br>放置
Bootloader
的第一条指令:
b ResetHandler
,跳转到标号为
ResetHandler
处进行第
一阶段的
硬件初始化,主要内容为:关看门狗定时器,关中断,初始化
< br>PLL
和时钟,初始化存储器系统。执
行完以上程序后
,系统进行堆栈和存储器的初始化。系统堆栈初始化取决于用户使用了哪些中断,以
及系
统需要处理哪些错误类型。
一般情况下,
管理者堆栈必须设置,
如果使用了
IRQ
中断,
则
IRQ
堆
栈也必须设置。如果系统使用了外设,则需要设置相关的寄存器,以确定其刷新频
率、总线宽度等信
息。
●
代码段复制到
RAM
中运行
因为嵌入式系统的代码通常都是固化在
ROM
或者
Flash
中,上电后开始运行。由于
< br>ROM
和
Flash
的
读取速度相对较慢,这样无疑会降低代码的执行速度和系统的运行效率。为此,需要把系统的代
码复
制到
RAM
中运行。
使用
SDT
链接器
ARMLink
产生的定位信息,
把
RO
的有效代码和数据段到
RAM
中。
ARMLink
将编译后的程序链接成
ELF
文件。映像文件内部共有三种输出段:
RO
段、
RW
段和
ZI
段。
这三种输出段分别包含了只读代码及包含在代码段中的少量数据、可读写的数据、初始化为
0
的数
据,
ARMLink
同时还产生了这三种输出段的起始和终止定位信息:
Image$$$$RO$$$$Base
、
Image$$$$RO$$$$Limit
、
image$$$$RW$$$$Base
、
Image$$$$Limit
、
Image$$$$Linit <
/p>
和
Image$$$$ZI$$$$Limit
。
可以
在程序中使用这些定位信息。将
ROM
中的代码和数据搬移到
RAM
中。
●
建立二级中断向量表
在
ARM
系统中,中断向量表位于
0x000000000
开始的地址处,意味着无论运行什么样的上层软件,
一旦发生中断,
程序就得到
Flash
存储器中的中断向量
表里去,
降低系统的运行效率。
因此在
RAM
中
建立自己的二级中断向量表,当中断发生后,程序直
接从
RAM
中取中断向量进入中断子程序。尤其
是在中断频繁发生的系统里,这种方法可以大大提高系统的运行效率。
● MMU 的应用
MMU
是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。
MMU
通常是
CPU
的一部分,本身有
少量存储空间存放从虚拟地址到物理地址的匹配表,此表称作
TLB
(转换旁置缓冲区)。所有数据请
求都
送往
MMU
,由
MMU
决定数据是在
RAM
内还是在大容量
外部存储器设备内。如果数据不在存储空
间内,
MMU
将产生页面错误中断。
MMU
存储器
系统的结构允许对存储器系统的精细控制,大部分的控
制细节由存在存储器中的转换表提
供。
这些表的入口定义了从
1KB<
/p>
~
1MB
的各种存储器区域的属性。
MMU
完
成的两个主要功能是:将虚地址
转换成物理地址,控制存储器存取允许。
MMU
关掉时,虚地址直接输出到物理地址总线。
SDRAM
地址分配
三、启动代码完成的主要功能
1
)
建立异常中断的入口向量
2
)
建立中断向量表
3
)
为
ARM
每种运行模式设置堆栈
4
)
初始化
ARM
的
MPLL
时钟
5
)
初始化
MMU
(内存管理单元)
6
)
初始化存储器控制器
7
)
关闭看门狗、关闭中断
8
)
判断
IRQ
中断的中断入口
9
)
将
RW
段的内容从
flash
拷贝到
SDRAM
,初始化
ZI
段为
0
10
)
跳转到应用程序(
C
代码)
四、
S3C2410
初始化说明
1
创建中断向量表
中断向量表创建到
SDRAM
高位地址上,主要是因为
SDRAM
的地址位置需要放置执行的映象程序,而
且在
SDRAM
中查找向量表速度会快很多。中断向量表放置时需要字对齐。
ALIGN
;
通过添加补丁字节使当前位置满足一定的对齐方式
;
可读写的数据段
AREA RamData, DATA,
READWRITE
;^=MAP:
定义一个结构化的内存表
(
storage
map
)的首地址,地址为
0x33ff8000
^
_ISR_STARTADDRESS 0x33ff8000
HandleReset # 4 #
--
< br>Field
:定义一个结构化内存表中的数据域,该域为
4
个字节
HandleUndef # 4
HandleSWI #
4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ
# 4
HandleFIQ # 4
;Don
'
'
'
'
< br>'
'
'
'
'
'
'
'
'
'
'
'
t
use
the
label
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
IntVectorTable
'
'
'
'
'
'
'
p>
'
'
'
'
'
'
'
'
'
,
;The value of
IntVectorTable is different with the address you
think it may be.
;IntVectorTable
''''''''''''''''
HandleEINT0 # 4
HandleEINT1
# 4
HandleEINT2 # 4
HandleEINT3 # 4
HandleEINT4_7 # 4
HandleEINT8_23 # 4
HandleRSV6 # 4
HandleBATFLT
# 4
HandleTICK # 4
HandleWDT
# 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2
# 4
HandleLCD # 4
HandleDMA0
# 4
HandleDMA1 # 4
HandleDMA2 # 4
HandleDMA3 #
4
HandleMMC # 4
HandleSPI0 #
4
HandleUART1 # 4
HandleRSV24 # 4
HandleUSBD # 4
HandleUSBH #
4
HandleIIC # 4
HandleUART0
# 4
HandleSPI1 # 4
HandleRTC
# 4
HandleADC # 4
2
创建异常中断的入口函数
b
ResetHandler
b HandlerUndef handler
for Undefined mode
b HandlerSWI
;handler for SWI interrupt
b
HandlerPabort handler for PAbort
b
HandlerDabort handler for DAbort
b .
;reserved
b HandlerIRQ handler for IRQ
interrupt
b HandlerFIQ handler for FIQ
interrupt
异常向量的入口函数是由
8
个跳转指令组成的,
这
8
个跳转指令需要按照顺序放置到固定的地址上,
地址是
0x00
~
0x1c
,这
8
个跳转指令是
ARM
汇编指令,所以条指令占
4
个字节的位置。
3
关闭看门狗、关闭中断
ldr r0,=WTCON watch dog disable
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0xffffffff all interrupt
disable
str r1,[r0]
ldr r0,=INTSUBMSK
ldr
r1,=0x3ff all sub interrupt disable
str r1,[r0]
-
-
-
-
-
-
-
-
-
上一篇:UCOSIII 常用函数
下一篇:CodeWarrior介绍(自己整理)