LPC2xxx系列ARM启动代码分析 Init.s
2009-11-26 21:04
323 查看
;----------------可参照http://hi.baidu.com/hmos/blog/item/461babd358127434970a1677.html--------
;引入的外部标号在这声明
IMPORT __main ;C语言主程序入口
IMPORT InitStack ;初始化堆栈
IMPORT TargetResetInit ;目标板基本初始化
IMPORT |Image$$RO$$Limit| ;// 声明输入ROM区中的RW地址(即:存储RO代码最后地址的下一地址)
IMPORT |Image$$RW$$Base| ;// 声明输入RAM区的开始地址
IMPORT |Image$$ZI$$Base| ;// 声明输入零初始化区的开始地址
IMPORT |Image$$ZI$$Limit| ;// 声明输入零初始化区的末地址的下一地址
;给外部使用的标号在这声明
EXPORT Reset
EXPORT __rt_div0
EXPORT __user_initial_stackheap
;段声明
CODE32
AREA Init,CODE,READONLY
;/*********************************************************************************************************
;** 函数名称: Reset
;** 功能描述: 复位入口
;**
;** 输 入: 无
;**
;** 输 出: 无
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;********************************************************************************************************/
Reset
BL InitStack ;初始化堆栈
LDR r0, =|Image$$RO$$Limit|
LDR r1, =|Image$$RW$$Base|
LDR r3, =|Image$$ZI$$Base|
CMP R0,R1
BEQ NoRW
LoopRw
CMP r1, r3
ldrcc r2, [r0],#4
strcc r2, [r1],#4
bcc LoopRw
NoRW
ldr r1, =|Image$$ZI$$Limit|
mov r2, #0
LoopZI
CMP r3, r1
strcc r2, [r3], #4
bcc LoopZI
BL TargetResetInit ;目标板基本初始化
;跳转到c语言入口
B __main
;/*********************************************************************************************************
;** 函数名称: __user_initial_stackheap
;** 功能描述: 库函数初始化堆和栈,不能删除
;**
;** 输 入: 参考库函数手册
;**
;** 输 出: 参考库函数手册
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
MOV pc,lr
;/*********************************************************************************************************
;** 函数名称: __rt_div0
;** 功能描述: 整数除法除数为0错误处理函数,替代原始的__rt_div0减少目标代码大小
;**
;** 输 入: 参考库函数手册
;**
;** 输 出: 无
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;********************************************************************************************************/
__rt_div0
B __rt_div0
;/* 分配堆空间 */
AREA Myheap, DATA, NOINIT, ALIGN=2
bottom_of_heap SPACE 256 ;库函数的堆空间
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
;引入的外部标号在这声明
IMPORT __main ;C语言主程序入口
IMPORT InitStack ;初始化堆栈
IMPORT TargetResetInit ;目标板基本初始化
IMPORT |Image$$RO$$Limit| ;// 声明输入ROM区中的RW地址(即:存储RO代码最后地址的下一地址)
IMPORT |Image$$RW$$Base| ;// 声明输入RAM区的开始地址
IMPORT |Image$$ZI$$Base| ;// 声明输入零初始化区的开始地址
IMPORT |Image$$ZI$$Limit| ;// 声明输入零初始化区的末地址的下一地址
;给外部使用的标号在这声明
EXPORT Reset
EXPORT __rt_div0
EXPORT __user_initial_stackheap
;段声明
CODE32
AREA Init,CODE,READONLY
;/*********************************************************************************************************
;** 函数名称: Reset
;** 功能描述: 复位入口
;**
;** 输 入: 无
;**
;** 输 出: 无
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;********************************************************************************************************/
Reset
BL InitStack ;初始化堆栈
LDR r0, =|Image$$RO$$Limit|
LDR r1, =|Image$$RW$$Base|
LDR r3, =|Image$$ZI$$Base|
CMP R0,R1
BEQ NoRW
LoopRw
CMP r1, r3
ldrcc r2, [r0],#4
strcc r2, [r1],#4
bcc LoopRw
NoRW
ldr r1, =|Image$$ZI$$Limit|
mov r2, #0
LoopZI
CMP r3, r1
strcc r2, [r3], #4
bcc LoopZI
BL TargetResetInit ;目标板基本初始化
;跳转到c语言入口
B __main
;/*********************************************************************************************************
;** 函数名称: __user_initial_stackheap
;** 功能描述: 库函数初始化堆和栈,不能删除
;**
;** 输 入: 参考库函数手册
;**
;** 输 出: 参考库函数手册
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
MOV pc,lr
;/*********************************************************************************************************
;** 函数名称: __rt_div0
;** 功能描述: 整数除法除数为0错误处理函数,替代原始的__rt_div0减少目标代码大小
;**
;** 输 入: 参考库函数手册
;**
;** 输 出: 无
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;********************************************************************************************************/
__rt_div0
B __rt_div0
;/* 分配堆空间 */
AREA Myheap, DATA, NOINIT, ALIGN=2
bottom_of_heap SPACE 256 ;库函数的堆空间
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
相关文章推荐
- 转载 ARM启动代码分析-philips的LPC2xxx系列
- ARM启动代码的分析
- LPC2xxx启动代码分析
- ARM启动代码分析
- linux-3.2.36内核启动4-setup_arch中的内存初始化3(arm平台 bootmem_init源码分析)
- ARM-Linux移植之(三)——init进程启动流程分析
- ARM上电启动及Uboot代码分析
- android启动代码init.c文件分析(三)
- linux-3.2.36内核启动4-setup_arch中的内存初始化3(arm平台 bootmem_init源码分析)
- MTD系列 - android平台上linux启动时init进程解析init.rc文件分析
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)
- 对SmartARM2200 启动代码分析
- 周立功lpc21xx/lpc22xx系列ARM7启动代码分析1
- android启动代码init.c文件分析(四)
- U-Boot系列之三:u-boot整体结构及启动代码分析(有加入一些新东西)
- LPC系列 ARM7 startup.s 启动代码分析(ZZ)
- ARM-Linux移植之(三)——init进程启动流程分析
- ARM启动代码分析s64
- arm启动代码分析(转)
- ARM上电启动及Uboot代码分析