收藏 分享(赏)

系统引导程序的代码注释.doc

上传人:kpmy5893 文档编号:8533698 上传时间:2019-07-02 格式:DOC 页数:4 大小:40.50KB
下载 相关 举报
系统引导程序的代码注释.doc_第1页
第1页 / 共4页
系统引导程序的代码注释.doc_第2页
第2页 / 共4页
系统引导程序的代码注释.doc_第3页
第3页 / 共4页
系统引导程序的代码注释.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、第 3 章的附录 系统引导程序的代码下面是一个基于 S3C2410 芯片的嵌入式系统引导(启动)程序 Startup.s 文件中的汇编源程序。通过对这段程序的分析,巩固所学的汇编指令知识,并学习嵌入式系统引导程序的编写方法。程序中各条指令及指示符的具体含义请参照 3.1 节和 3.3.1 小节中的说明。;Startup Code for S3C2410 : Startup.s;下面指令包含 2410addr.s 文件,该文件中定义了 S3C2410 内部寄存器地址对应的变量。GET 2410addr.s ; 某些 ARM920T CPSR 寄存器位的定义,定义了部分常量。USERMODE EQ

2、U 0x10 ; USERMODE 等都是一些常量名称FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0;定义 IRQ 和 FIQ 相关的寄存器I_Bit * 0x80F_Bit * 0x40; 定义 MMU 相关的寄存器。CtrlMMU * 1CtrlAlign * 2CtrlCache * 4CtrlWBuff * 8CtrlBigEnd * 128CtrlSystem * 256CtrlROM * 512TLB

3、_L0_INIT * 0x0C02;AREA 指示汇编器汇编一段新的代码,为保证下面的代码为起始代码,应在 ARM连接器的 layout 选项中指明 Startup.o(Init) (如图 1-33 所示) ,或用 scatter 格式的描述性文件说明。AREA Init,CODE,READONLY;IMPORT 提供汇编器在当前汇编中未曾定义的符号名。IMPORT _use_no_semihosting_swiIMPORT Enter_UNDEFIMPORT Enter_SWIIMPORT Enter_PABORTIMPORT Enter_DABORTIMPORT Enter_FIQ;下面

4、ENTRY 指明了程序的入口,在应用程序中有且只有一个程序入口。ENTRY;下面是异常向量表,第一条语句是复位异常对应的跳转指令。b ColdReset ;复位b Enter_UNDEF ;未定义指令错误b Enter_SWI ;软件中断b Enter_PABORT ;预取指令错误b Enter_DABORT ;数据存取错误b . ;一个保留的中断向量b IRQ_Handler ;IRQHandlerb Enter_FIQ ;FIQHandler;处理 IRQ 中断EXPORTIRQ_Handler ;导入 IRQ_HandlerIRQ_Handler ;IRQ 中断处理函数IMPORT IS

5、R_IrqHandler ;导入 ISR_IrqHandlerSTMFD sp!, r0-r12, lr ;寄存器入栈BL ISR_IrqHandler ;跳转到 ISR_IrqHandler 函数LDMFD sp!, r0-r12, lr;寄存器出栈SUBS pc, lr, #4 ;返回;系统上电或复位后跳转到此处开始进行运行。 EXPORT ColdResetColdReset;关看门狗定时器ldr r0,=WTCON ;R0=WTCON,后面有类似的操作时注释略ldr r1,=0x0 ;R1=0str r1,r0 ;将 R1 的内容存入 R0;关所有中断ldr r0,=INTMSKldr

6、 r1,=0xffffffff ;关闭所有中断str r1,r0 ;将 R1 的内容存入 R0ldr r0,=INTSUBMSKldr r1,=0x7ff ;关闭所有子中断str r1,r0 ;将 R1 的内容存入 R0;初始化堆栈bl InitStacks ;跳转到 InitStacks 设置各模式的堆栈;复制 excption table 到 SRAM0x0 地址处;导入相应的标号IMPORT |Load$EXCEPTION_EXEC$Base|IMPORT |Image$EXCEPTION_EXEC$Base|IMPORT |Image$EXCEPTION_EXEC$Length|ldr

7、 r0, =|Load$EXCEPTION_EXEC$Base| ;源数据ldr r1, =|Image$EXCEPTION_EXEC$Base| ;目的地址处ldr r2, =|Image$EXCEPTION_EXEC$Length| ;大少长度exception_cploopsub r2, r2, #4 ;R2=R2-4ldmia r0!, r3 ;将 R0 指向的内容压入 R3,之后 R0 地址自增stmia r1!, r3;将 R3 中的内容取出到 R1,之后 R1 地址自增cmp r2, #0 ;判断 R2 是否为 0bge exception_cploop ;大于 0 则继续循环;

8、下面调转到 C 语言的主函数处IMPORT _mainBL _main ;进入 MAIN 函数B .;下面是初始化堆栈的子函数IMPORT UserStack ;导入 UserStackIMPORT SVCStack ;导入 SVCStackIMPORT UndefStack;导入 UndefStackIMPORT IRQStack;导入 IRQStackIMPORT AbortStack;导入 AbortStackIMPORT FIQStack;导入 FIQStackInitStacksmrs r0,cpsr ;CPSR 的值存入 R0bic r0,r0,#MODEMASK ;R0 中的相应

9、位清 0orr r1,r0,#UNDEFMODE|NOINT ;R1=R0 ORR #UNDEFMODE|NOINT中断也禁止了,后面类似的操作时注释略msr cpsr_cxsf,r1 ;转到未定义模式ldr sp,=UndefStack ;设置 SPorr r1,r0,#ABORTMODE|NOINTmsr cpsr_cxsf,r1 ;转到中止模式ldr sp,=AbortStack ;设置 SPorr r1,r0,#IRQMODE|NOINTmsr cpsr_cxsf,r1 ;转到 IRQ 模式ldr sp,=IRQStack ;设置 SPorr r1,r0,#FIQMODE|NOINTm

10、sr cpsr_cxsf,r1 ;转到 FIQ 模式ldr sp,=FIQStack ;设置 SPorr r1,r0,#SVCMODE|NOINTmsr cpsr_cxsf,r1 ;转到管理模式ldr sp,=SVCStack ;设置 SPmov pc,lr ;LR 的值传给 PC,子程序返回END ;Stratup.s 程序结束上述程序代码中,ENTRY 指明了程序的入口。因为, ARM920T 要求中断向量表必须设置在从 0x0 地址开始,连续 84 字节的空间中,因此,在 ENTRY 的后面紧接着 8 条跳转指令,分别对应复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、一个保留的中断向量、IRQ 和 FIQ 等异常的处理。 系统上电或复位后,首先执行的是“b ColdReset”指令,系统跳转到标号为 ColdReset处接着执行,在完成了关看门狗定时器、关中断、初始化各模式的堆栈、初始化存储器等功能后,执行指令“BL _main”跳转到 C 语言的主函数处执行。本例中,初始化堆栈的功能编写成了子函数,在该子函数中,没有对用户模式下的堆栈进行初始化。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报