...
DCD &10000398 ;/*DRAMCON0 0x0--0x1000000*/
...
(7)进入C代码空间,开始主程式的运行。此时代码应该运行于RAM中。
上面的步骤能够根据实际的需要进行适当的添加或删节。值得注意的是,汇编生成的代码应该是和位置无关的代码,即代码在运行期间能够被映射到不同的地址空间,其中的跳转指令都是基于PC寄存器的相对跳转指令。(基于PC的标号是位于目标指令前或程式中数据定义伪操作前的标号,这种符号在汇编时将被处理成PC值加上或减去一个数字常量。)
在Remap的启动代码中,需要特别注意的是异常中断的处理。在S3c4510b中,异常中断的入口地址是固定的,按如下次序排列:
异常类型 工作模式 正常地址
复位 管理 0x00000000
未定义指令 未定义 0x00000004
软件中断(SWI) 管理 0x00000008
预取中止 中止 0x0000000C
数据中止 中止 0x00000010
预留 0x00000014
IRQ(中断) IRQ 0x00000018
FIQ(快速中断) FIQ 0x0000001C
地址重映射之后,入口地址被映射到RAM中,中断处理代码也被搬移到RAM地址空间,此时中断响应和中断处理的速度都将大大加快,这将有利于提高整个系统的实时性。异常中断向量表的设计结构如下:
(抱歉,图贴不上来)
各部分的源代码:(以IRQ异常中断为例)
异常向量表的定义:
_RAM_END_ADDR EQU 0x01000000 ;重映射后RAM的截止地址
MAP (_RAM_END_ADDR-0x100)
SYS_RST_VECTOR # 4
UDF_INS_VECTOR # 4
SWI_SVC_VECTOR # 4
INS_ABT_VECTOR # 4
DAT_ABT_VECTOR # 4
RESERVED_VECTOR # 4
IRQ_SVC_VECTOR # 4
FIQ_SVC_VECTOR # 4
异常初始化代码:
...
b IRQ_SVC_HANDLER ;0x18
...
IRQ_SVC_HANDLER
SUB sp, sp, #4 ;满递减堆栈
STMFD sp!,
LDR r0, =IRQ_SVC_VECTOR ;读取中断向量,IRQ_SVC_VECTOR=SystemIrqHandler
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc} ;跳转到异常中断处理代码入口
...
异常处理入口代码:
...
SystemIrqHandler
IMPORT ISR_IrqHandler
STMFD sp!, {r0-r12, lr}
BL ISR_IrqHandler ;跳转到C代码中异常中断处理程式ISR_IrqHandler
LDMFD sp!, {r0-r12, lr}
SUBS pc, lr, #4
...
在如上的结构中,不管系统是否进行了地址的重映射,异常中断向量都能够在运行时动态改变,这大大提高了中断处理中的灵活性,中断向量能够在运行时指向不同的异常处理代码入口。按照上面的异常处理结构,异常中断的响应流程如下:(以IRQ异常中断为例)
(1)接收到IRQ中断请求,执行完当前指令后,程式自动跳转到0x18处
(2)程式跳转到异常初始化代码中,完成满递减堆栈初始化及所用寄存器压栈(允许异常中断嵌套),读取中断向量IRQ_SVC_VECTOR,跳转到中断向量所指向的异常处理入口
(3)将通用寄存器和LR入栈,跳入异常中断处理程式ISR_IrqHandler
C语言中中断的安装:
S3c4510b中有21个中断源,各中断源能够选择异常响应的模式:快速中断模式FIQ或普通中断模式IRQ,以IRQ为例,中断处理程式的安装代码如下:
#define MAXHNDLRS 21;
...
void (*InterruptHandlers[MAXHNDLRS])(void);
//中断源向量表,保存21个中断的中断处理程式入口
static void DummyIsr(void) {}; //空操作函数,用于初始化中断源向量表
...
void SysSetInterrupt(REG32 vector, void (*handler)()) //中断安装函数
{
InterruptHandlers[vector] = handler;
}
void InitIntHandlerTable(void) //中断源初始化
{
REG32 i;
for (i = 0; i >2])(); // Call interrupt service routine
}
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




