看了好几天的发动代码了,总算把大部分的东西都看懂了,在此收拾下自己对TQ2440开发板发动代码的了解(参阅了网上找的一些材料),并贴出来供咱们看一下,期望对咱们有协助,假设有什么错了的当地,也请咱们不吝赐教。
;=========================================
; NAME: 2440INIT.S
; DESC: C start up codes
; Configure memory, ISR ,stacks
; Initialize C-variables
;=========================================
发动代码主要是在主程序运转之前初始化体系硬件及软件的运转环境,它的主要功能包括以下的几个方面:
1、树立间断向量表
2、初始化体系仓库
3、应用程序履行环境初始化
4 跳转至主函数
接下来对各个部分进行剖析
;GET 是包括头文件的意思,相当于C语言中的include,是将一个源文件包括到当时源文件中,并将被包括的文件在其当时方位进行汇编处理
GET option.inc ;option.inc文件包括了开发板的装备信息—仓库、时钟等
GET memcfg.inc ;存储操控文件
GET 2440addr.inc ;寄存器地址地址界说
BIT_SELFREFRESH EQU (1<<22) ;SDRAM自改写标志位
;预界说的作业形式
;ARM 有7 种形式,用户形式,快速间断形式,间断形式,管理形式,间断形式,不决
;义形式和体系形式。体系仓库的初始化主要是给各个处理器形式分配仓库空间。仓库是为
;间断或程序跳转服务的,当产生间断或程序跳转时,需要将当时处理器的状况及一些参数
;保持在仓库中,当间断处理完毕今后或程序履行完后回来时,再将仓库保存的现场数据进
;行康复,以确保本来的程序正确运转
;Pre-defined constants
USERMODE EQU 0x10 ;用户形式
FIQMODE EQU 0x11 ;快速间断形式
IRQMODE EQU 0x12 ;间断形式
SVCMODE EQU 0x13 ;管理形式
ABORTMODE EQU 0x17 ;间断形式
UNDEFMODE EQU 0x1b ;未界说形式
MODEMASK EQU 0x1f ;形式掩码
NOINT EQU 0xc0 ;无间断形式
;The location of stacks
;界说各种形式下运用的仓库开端地址,_STACK_BASEADDRESS是由option.inc界说的
UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~
SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~
;Check if tasm.exe(armasm -16 …@ADS 1.0) is used.
; 判别是否THUMB指令
; [ 代表IF,| 指的是ELSE,] 相当于ENDIF
GBLL THUMBCODE ;界说一个局部变量THUMBCODE
[ {CONFIG} = 16 ;假设是16位代码,则将THUMBCODE设为真
THUMBCODE SETL {TRUE} ;
CODE32 ;否则是ARM指令
|
THUMBCODE SETL {FALSE}
]
; 宏界说,用于子程序的回来
MACRO
MOV_PC_LR
[ THUMBCODE ;假设方针地址是THUMB的指令,则跳到THUMB地址
bx lr ;在ARM形式中,要用BX指令跳转到THUMB指令,并转化形式
|
mov pc,lr ;假设方针地址是ARM指令,则直接把函数回来地址给PC
]
MEND
MACRO
MOVEQ_PC_LR ;带条件的函数回来,与MOV_PC_LR相似
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND
PS:下面这一段是网上找的,我觉得它现已介绍的十分好了,所以就直接拿过来用来,呵呵
;===============================================================
;下面这个宏是用于榜首次查表进程的完成间断向量的重定向,你会发现
;在_ISR_STARTADDRESS=0x33FF_FF00里界说的榜首级间断向量表
;是选用型如Handle***的方法的. 而在程序的ENTRY处(程序开端处)选用的是
;b Handler***的方法.
;在这里Handler***便是经过HANDLER这个宏和Handle***进立联络的.
;这种方法的长处便是正真界说的向量数据在内存空间里,而不是在ENTRY处
;的ROM(FLASH)空间里, 这样,咱们就可以在程序里灵敏的改动向量的数据了.
;其间HANDLER是一个宏,用于查找间断处理程序的进口地址。这些地址存放在
;由HandleXXX指向的表项中,该表定位在RAM高端,基地址为_ISR_STARTADDRESS。
;假设_ISR_STARTADDRESS为 0x800000000,当IRQ间断时,依据b HandlerFIQ,先跳转
;再依据^ _ISR_STARTADDRESS基地址+HandleIRQ 的偏移地址(4*6)得到的间断地址
;0x80000000+0x00000024=0x80000024