GT2440启动代码分析(精)

上传人:大米 文档编号:504391384 上传时间:2023-04-21 格式:DOC 页数:27 大小:130KB
返回 下载 相关 举报
GT2440启动代码分析(精)_第1页
第1页 / 共27页
GT2440启动代码分析(精)_第2页
第2页 / 共27页
GT2440启动代码分析(精)_第3页
第3页 / 共27页
GT2440启动代码分析(精)_第4页
第4页 / 共27页
GT2440启动代码分析(精)_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《GT2440启动代码分析(精)》由会员分享,可在线阅读,更多相关《GT2440启动代码分析(精)(27页珍藏版)》请在金锄头文库上搜索。

1、 2440INIT.S;在编写arm汇编语言源程序时要遵循一定的规范,否则编译器会报错。;1.在arm汇编程序中,所有的标号必须在一行的顶格写。;2.在arm汇编程序中,所有的指令均不能顶格书写,指令前面应该有空格,一;般用tab健.;3.因为arm汇编器对标志符的大小写敏感,因此书写标志及指令时,大小写要;一致。在arm汇编程序中,指令、寄存器名可以全部为大写,也可以全部为小;写,但是不能大小写混合使用。;4.在在arm汇编程序中使用注释,注释内容由“;”开始一直到此行结束,注释;可以顶格写.;5.为了我增加源程序的可读性,在完成不同功能的代码段之间可以适当插入一;些空行。;6.当单行指令太

2、长时,可以使用字符“”实现分行,“”后边不能有任何字符。;7.定义变量、常量时,其标识符必须在一行的顶格书写,否则编译器报错。;8.函数名需要顶格写.GET option.inc ;定义芯片相关的配置,包含选项说明,如pll等 GET memcfg.inc ;定义存储器相关设置,包含MMUGET 2440addr.inc ;定义寄存器符号和地址BIT_SELFREFRESH EQU(122) ;用于节电模式中,SDRAM自动刷新USERMODE EQU 0x10 ;宏定义处理器工作模式FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMO

3、DE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0;定义各模式的堆栈指针常量用于初始化堆栈sp(R13) ;即使程序只在SRAM中运行(小于4k),当进入某模式时,也会在SDRAM中进行堆栈操作UserStackEQU (_STACK_BASEADDRESS-0x3800);0x33ff4800 SVCStack EQU(_STACK_BASEADDRESS-0x2800);0x33ff5800 UndefStack EQU(_STACK_BASEADDRESS-0x2400);0x33ff5c00 AbortStack E

4、QU(_STACK_BASEADDRESS-0x2000);0x33ff6000 IRQStack EQU(_STACK_BASEADDRESS-0x1000);0x33ff7000 FIQStack EQU(_STACK_BASEADDRESS-0x0);0x33ff8000 ;编译模式判定。CONFIG是编译器内建变量,编译时自动复制。ADS1.0中;CONFIG=16(THUMB).ADS1.2中CONFIG=32(ARM).GBLL THUMBCODE CONFIG = 16THUMBCODE SETL TRUE CODE32 ; 用户代码需用CODE16编译,以下还是ARM编译 |T

5、HUMBCODE SETL FALSE ; 寄存器R14又被称为连接寄存器(LR). ;每一种处理器模式在自己的R14中存放当前子程序的返回地址。 ;当通过BL或者BLX指令调用子程序时,R14被设置成该子程序的返回地址。 ;在子程序中,当把R14的值复制到程序计数器PC中时,就实现了子程序返回 MACRO MOV_PC_LR ; 宏定义MOV_PC_LR,作用:子程序返回.不能顶格 THUMBCODE bx lr ; 当目标程序是Thumb指令集时,就要使用BX 跳转返回,并判定是否转换模式。; BX会根据PC的最后一位判断是否进入ARM模式。| movpc,lr; 目标程序是ARM 指令集

6、,直接把lr 赋给pc 就可以了. MEND; 带相等条件判断的子程序返回,”判定指令 MOVEQ_PC_LR”.(本程序中未使用) MACRO MOVEQ_PC_LR THUMBCODE bxeq lr | moveq pc,lr MEND;在宏定义下面的handlexxx HANDLER handlexxx 都会展成以下的程序段,这段程序主要把中断;服务程序的入口地址传送给pc,在程序的用34 字空间来存放中断服务程序的入口地址,每;个字空间都会有一个标号,以handlerxxx 开头的。这些地址存放在 由HandleXXX指向的;表项中,该表定位在SDRAM高端,基地址_ISR_STAR

7、TADDRESS。 ;假如_ISR_STARTADDRESS=0x800000000,当IRQ中断时,根据b HandlerFIQ,先跳转;再根据 _ISR_STARTADDRESS基地址+HandleIRQ 的偏移地址(isrIRQ实现)(4*6)得;到的中断地址0x80000000+0x00000024=0x80000024 MACRO$HandlerLabel HANDLER $HandleLabel ;需要顶格$HandlerLabel subsp,sp,#4 ;先预留空间,为了存储跳转地址(一级中断函数地址,;例如isrIRQ地址,再利用isrIRQ查询具体中断)stmfdsp!,r

8、0 ; 把工作寄存器压栈(保保护现场),sp-4ldr r0,=$HandleLabelldr r0,r0 ;这两句的功能是把中断程序的入口地址先放在中间变量r0 处.str r0,sp,#4;一级中端函数地址压栈,pc不变 ldmfd sp!,r0,pc;执行中断函数。r0r0,中断pc,sp恢复原来的值 MEND ; IMPORT 相当于C语言的extren。IMPORT |Image$RO$Base| ;编译器自动生成并给值(ARM linker中设置)IMPORT |Image$RO$Limit| ; End of ROM code (=start of ROM data)IMPORT

9、 |Image$RW$Base| ; Base of RAM to initialiseIMPORT |Image$ZI$Base| ; Base and limit of areaIMPORT |Image$ZI$Limit| ; to zero initialize; 引入外部变量mmu快速总线模式和同步总线模式IMPORTMMU_SetAsyncBusModeIMPORTMMU_SetFastBusModeIMPORT Main ; The main entry of mon programIMPORT RdNF2SDRAM; Copy Image from Nand Flash to

10、SDRAMAREA Init,CODE,READONLY;程序入口处ENTRY EXPORT_ENTRY_ENTRYResetEntry; 判断是否定义了ENDIAN_CHANGE,如果没有定义,则报告该处错误信息(停止编) ASSERT:DEF:ENDIAN_CHANGE ENDIAN_CHANGEASSERT :DEF:ENTRY_BUS_WIDTH ENTRY_BUS_WIDTH=32bChangeBigEndian ;DCD 0xea000007 ENTRY_BUS_WIDTH=16andeqr14,r7,r0,lsl #20 ;DCD 0x0007ea00 ENTRY_BUS_WID

11、TH=8streqr0,r0,-r10,ror #1 ;DCD 0x070000ea|bResetHandler;复位bHandlerUndef;handler for Undefined modebHandlerSWI ;handler for SWI interruptbHandlerPabort;handler for PAbortbHandlerDabort;handler for DAbortb. ;reservedbHandlerIRQ ;handler for IRQ interruptbHandlerFIQ ;handler for FIQ interrupt;0x20bEnt

12、erPWDN; Must be 0x20. ;发生异常时,就会进行相应的跳转ChangeBigEndian ENTRY_BUS_WIDTH=32DCD0xee110f10DCD0xe3800080DCD0xee010f10 ENTRY_BUS_WIDTH=16DCD 0x0f10ee11DCD 0x0080e380DCD 0x0f10ee01 ENTRY_BUS_WIDTH=8DCD 0x100f11eeDCD 0x800080e3DCD 0x100f01eeDCD 0xffffffff ; 相当于NOP指令,进行延时DCD 0xffffffffDCD 0xffffffffDCD 0xffff

13、ffffDCD 0xffffffffb ResetHandler ;复位HandlerFIQ HANDLER HandleFIQ ;标记需放在AREA块中HandlerIRQ HANDLER HandleIRQHandlerUndefHANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabortHANDLER HandleDabortHandlerPabortHANDLER HandlePabortIsrIRQ subsp,sp,#4 ;reserved for PCstmfdsp!,r8-r9ldrr9,=INTOFFSETldrr9,r9ldrr8,=HandleEINT0addr8,r8,r9,lsl #2ldrr8,r8strr8,sp,#8ldmfdsp!,r8-r9,pc;执行中断子函数,然后再返回到正常程序处执行!;在使用LDR伪指令时,要在适当的地址加入LTORG声明 ;文字池,这样就会把要加载的数据保存在文字池内,再用 ARM 的加载指令读出数;据.(若没有使用 LTORG 声明文字池,则汇编器会在程序末尾自动声明.) LTORG ResetHandlerldrr0,=WTCON

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号