第3章的附录 系统引导程序的代码
更新时间:2023-10-26 07:30:01 阅读量: 综合文库 文档下载
- 第3章的生命推荐度:
- 相关推荐
第3章的附录 系统引导程序的代码
下面是一个基于S3C2410芯片的嵌入式系统引导(启动)程序Startup.s文件中的汇编源程序。通过对这段程序的分析,巩固所学的汇编指令知识,并学习嵌入式系统引导程序的编写方法。程序中各条指令及指示符的具体含义请参照3.1节和3.3.1小节中的说明。
;Startup Code for S3C2410 : Startup.s
;下面指令包含2410addr.s文件,该文件中定义了S3C2410内部寄存器地址对应的变量。 GET 2410addr.s
; 某些ARM920T CPSR寄存器位的定义,定义了部分常量。
USERMODE EQU FIQMODE EQU IRQMODE EQU SVCMODE EQU ABORTMODE EQU UNDEFMODE EQU MODEMASK EQU NOINT
I_Bit * 0x80 F_Bit * 0x40
; MMU寄存器定义。 CtrlMMU CtrlAlign
* * * * * * *
1 2 4 8 128 256 512
EQU
0x10 0x11 0x12 0x13 0x17 0x1b 0x1f 0xc0
CtrlCache CtrlWBuff CtrlBigEnd CtrlSystem CtrlROM
TLB_L0_INIT * 0x0C02
;AREA指示汇编器汇编一段新的代码,为保证下面的代码为起始代码,应在ARM连接器的layout选项中指明Startup.o(Init) (如图1-33所示),或用scatter格式的描述性文件说明。
AREA Init,CODE,READONLY
;IMPORT提供汇编器在当前汇编中未曾定义的符号名。
IMPORT __use_no_semihosting_swi IMPORT Enter_UNDEF IMPORT Enter_SWI IMPORT Enter_PABORT
IMPORT Enter_DABORT
IMPORT Enter_FIQ
;下面ENTRY指明了程序的入口,在应用程序中有且只有一个程序入口。 ENTRY
;下面是异常向量表,第一条语句是复位异常对应的跳转指令。
b b b b b b b b
ColdReset Enter_UNDEF Enter_SWI Enter_PABORT Enter_DABORT .
IRQ_Handler Enter_FIQ
;复位
;未定义指令错误 ;软件中断
;预取指令错误 ;数据存取错误 ;一个保留的中断向量 ;IRQHandler ;FIQHandler
;deal with IRQ interrupt EXPORT IRQ_Handler IRQ_Handler IMPORT ISR_IrqHandler
STMFD sp!, {r0-r12, lr}
BL ISR_IrqHandler LDMFD sp!, {r0-r12, lr}
SUBS pc, lr, #4
;系统上电或复位后跳转到此处开始进行运行。
EXPORT ColdReset
ColdReset
;关看门狗定时器
ldr r0,=WTCON
ldr r1,=0x0 str r1,[r0] ;关所有中断
ldr r0,=INTMSK ldr r1,=0xffffffff str r1,[r0]
ldr r0,=INTSUBMSK ldr r1,=0x7ff ;all sub interrupt disable
str r1,[r0]
;初始化堆栈 bl InitStacks ;Stack Setup for each MODE ;复制excption table到SRAM0x0地址处
IMPORT |Load$$EXCEPTION_EXEC$$Base| IMPORT |Image$$EXCEPTION_EXEC$$Base| IMPORT |Image$$EXCEPTION_EXEC$$Length| ldr r0, =|Load$$EXCEPTION_EXEC$$Base|
;源数据
ldr r1, =|Image$$EXCEPTION_EXEC$$Base| ;目的地址处
ldr r2, =|Image$$EXCEPTION_EXEC$$Length| exception_cploop sub r2, r2, #4 ldmia r0!, {r3} stmia
r1!, {r3}
cmp r2, #0
bge exception_cploop
;下面调转到C语言的主函数处 IMPORT __main
BL __main
;通常不能用main()作为主函数名
B .
;下面是初始化堆栈的子函数
IMPORT UserStack
IMPORT SVCStack
IMPORT UndefStack IMPORT IRQStack IMPORT AbortStack
IMPORT FIQStack
InitStacks
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT msr cpsr_cxsf,r1 ;UndefMode ldr sp,=UndefStack
orr r1,r0,#ABORTMODE|NOINT msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode ldr sp,=IRQStack
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode ldr sp,=FIQStack
orr r1,r0,#SVCMODE|NOINT msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack
mov pc,lr
;The LR register may be not valid for changes.
the
mode
END ;Stratup.s程序结束
上述程序代码中,ENTRY指明了程序的入口。因为,ARM920T要求中断向量表必须设置在从0x0地址开始,连续8×4字节的空间中,因此,在ENTRY的后面紧接着8条跳转指令,分别对应复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、一个保留的中断向量、IRQ和FIQ等异常的处理。
系统上电或复位后,首先执行的是“b ColdReset”指令,系统跳转到标号为ColdReset处接着执行,在完成了关看门狗定时器、关中断、初始化各模式的堆栈、初始化存储器等功能后,执行指令“BL __main”跳转到C语言的主函数处执行。本例中,初始化堆栈的功能编写成了子函数,在该子函数中,没有对用户模式下的堆栈进行初始化。
正在阅读:
第3章的附录 系统引导程序的代码10-26
教育叙事之亲子教育心得体会11-30
基层示范党支部现场会主要做法介绍03-12
微课教学在大学英语翻译教学中的可行性研究11-30
励志流行歌曲02-19
德育主题、校园文化活动(一)11-30
Weblogic试题(含答案)03-10
编译原理 龙书答案11-30
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 附录
- 引导
- 代码
- 程序
- 系统
- 关于电力公司照明铁塔爬梯说明 - 图文
- 六年级下学期品社复习题
- 关于进一步明确职责切实做好极端天气下各种自然灾害防范应对工作的紧急通知
- 辩证法试题 - 00
- 小学生安全教育教案--食品安全
- 第六章 半固体制剂
- 三上集体备课含单元备课 - 图文
- HND大二经济学 outcome1
- 2012通用技术高考复习专题五 - 结构与设计- 副本 - 图文
- 学校防震避震常识手册
- 领导干部公选的创新尝试
- 当代应用写作 思考与训练答案
- 佛说一切诸如来心光明加持普贤菩萨延命金刚最胜陀罗尼经
- 004 - 951 - 语文教学论
- 至2012历年北京师范大学文学类考研真题
- 外来人口管理论文
- 如何做好初一的班主任工作
- 《青蛙看海》教学设计 - 图文
- premiere pro菜单命令中英文对照(按字母顺序排列)
- 高二物理选修34第11章限时检测