这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于bootloader问题

共1条 1/1 1 跳转至

关于bootloader问题

菜鸟
2005-09-14 00:34:02     打赏

我在做一个ARM7的MCU,片内0x0是128k的flash,0x40000000是16k的sram,没有存储器映射,现在想测试一下中断控制器,不知道bootloader该如何写,仿照周立功的LPC2210的初始化文件改了一个,不知道那里有问题无法运行,代码如下:

;定义堆栈的大小
USR_STACK_LEGTH EQU 256
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0

;引入的外部标号在这声明

IMPORT main ;C语言主程序入口

;给外部使用的标号在这声明
EXPORT Reset

CODE32

AREA vectors,CODE,READONLY
ENTRY
;中断向量表
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr

ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler

;未定义指令
Undefined
B Undefined

;软中断
SoftwareInterrupt
B SoftwareInterrupt

;取指令中止
PrefetchAbort
B PrefetchAbort

;取数据中止
DataAbort
B DataAbort

;快速中断
FIQ_Handler
B FIQ_Handler

InitStack
MOV R0, LR

;设置管理模式堆栈
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;设置中断模式堆栈
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;设置中止模式堆栈
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;设置未定义模式堆栈
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;设置系统模式堆栈
MSR CPSR_c, #0xdf
LDR SP, =StackUsr

MOV PC, R0

ResetInit

BL InitStack ;初始化堆栈
;跳转到c语言入口
B main


StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

AREA Heap, DATA, NOINIT
bottom_of_heap SPACE 1

;/* 分配堆栈空间 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈
StackUsr SPACE 1
END

附LPC2210的分散加载文件:

ROM_LOAD 0x80000000
{
ROM_EXEC 0x80000000
{
Startup.o (vectors, +First)
* (+RO)
}

IRAM 0x40000000
{
Startup.o (+RW,+ZI)
}

STACKS 0x40004000 UNINIT
{
stack.o (+ZI)
}

ERAM 0x80040000
{
* (+RW,+ZI)
}

HEAP +0 UNINIT
{
heap.o (+ZI)
}
}

附:

AREA Heap, DATA, NOINIT

EXPORT bottom_of_heap

bottom_of_heap SPACE 1

END

AREA Stacks, DATA, NOINIT
EXPORT StackUsr


StackUsr SPACE 1

END

说明:周立功的EASYARM2210的开发板0x80000000地址处是片外ram,0x40000000是片内的16k的ram(应该到0x40003fff处),memmap是从0x80000000映射到0x0处。

这个分散加载文件看不明白,尤其是STACKS 0x40004000,在0x40004000处已经不存在ram了,为什么还选择这个地址?

对init文件需要如何修改?ro—base,rw-base应该设置什么值合适?是否需要重新定义系统堆函数?




关键词: 关于     bootloader     问题     堆栈     STACK    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]