新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > TQ2440啟動(dòng)代碼分析(一)

TQ2440啟動(dòng)代碼分析(一)

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
看了好幾天的啟動(dòng)代碼了,終于把大部分的東西都看懂了,在此整理下自己對(duì)TQ2440開發(fā)板啟動(dòng)代碼的理解(參考了網(wǎng)上找的一些資料),并貼出來供大家看一下,希望對(duì)大家有幫助,如果有什么錯(cuò)了的地方,也請(qǐng)大家不吝賜教。

;=========================================

本文引用地址:http://butianyuan.cn/article/201611/321668.htm

; NAME: 2440INIT.S

; DESC: C start up codes

; Configure memory, ISR ,stacks

; Initialize C-variables

;=========================================

啟動(dòng)代碼主要是在主程序運(yùn)行之前初始化系統(tǒng)硬件及軟件的運(yùn)行環(huán)境,它的主要功能包括以下的幾個(gè)方面:

1、建立中斷向量表

2、初始化系統(tǒng)堆棧

3、應(yīng)用程序執(zhí)行環(huán)境初始化

4 跳轉(zhuǎn)至主函數(shù)

接下來對(duì)各個(gè)部分進(jìn)行分析

;GET 是包含頭文件的意思,相當(dāng)于C語言中的include,是將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理

GET option.inc ;option.inc文件包含了開發(fā)板的配置信息—堆棧、時(shí)鐘等

GET memcfg.inc ;存儲(chǔ)控制文件

GET 2440addr.inc ;寄存器地址地址定義

BIT_SELFREFRESH EQU (1<<22) ;SDRAM自刷新標(biāo)志位

;預(yù)定義的工作模式

;ARM 有7 種模式,用戶模式,快速中斷模式,中斷模式,管理模式,中止模式,未定

;義模式和系統(tǒng)模式。系統(tǒng)堆棧的初始化主要是給各個(gè)處理器模式分配堆??臻g。堆棧是為

;中斷或程序跳轉(zhuǎn)服務(wù)的,當(dāng)發(fā)生中斷或程序跳轉(zhuǎn)時(shí),需要將當(dāng)前處理器的狀態(tài)及一些參數(shù)

;保持在堆棧中,當(dāng)中斷處理完畢以后或程序執(zhí)行完后返回時(shí),再將堆棧保存的現(xiàn)場(chǎng)數(shù)據(jù)進(jìn)

;行恢復(fù),以保證原來的程序正確運(yùn)行

;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,] 相當(dāng)于ENDIF

GBLL THUMBCODE ;定義一個(gè)局部變量THUMBCODE

[ {CONFIG} = 16 ;如果是16位代碼,則將THUMBCODE設(shè)為真

THUMBCODE SETL {TRUE} ;

CODE32 ;否則是ARM指令

|

THUMBCODE SETL {FALSE}

]

; 宏定義,用于子程序的返回

MACRO

MOV_PC_LR

[ THUMBCODE ;如果目標(biāo)地址是THUMB的指令,則跳到THUMB地址

bx lr ;在ARM模式中,要用BX指令跳轉(zhuǎn)到THUMB指令,并轉(zhuǎn)換模式

|

mov pc,lr ;如果目標(biāo)地址是ARM指令,則直接把函數(shù)返回地址給PC

]

MEND

MACRO

MOVEQ_PC_LR ;帶條件的函數(shù)返回,與MOV_PC_LR類似

[ THUMBCODE

bxeq lr

|

moveq pc,lr

]

MEND

PS:下面這一段是網(wǎng)上找的,我覺得它已經(jīng)介紹的非常好了,所以就直接拿過來用來,呵呵

;===============================================================

;下面這個(gè)宏是用于第一次查表過程的實(shí)現(xiàn)中斷向量的重定向,你會(huì)發(fā)現(xiàn)

;在_ISR_STARTADDRESS=0x33FF_FF00里定義的第一級(jí)中斷向量表

;是采用型如Handle***的方式的. 而在程序的ENTRY處(程序開始處)采用的是

;b Handler***的方式.

;在這里Handler***就是通過HANDLER這個(gè)宏和Handle***進(jìn)立聯(lián)系的.

;這種方式的優(yōu)點(diǎn)就是正真定義的向量數(shù)據(jù)在內(nèi)存空間里,而不是在ENTRY處

;的ROM(FLASH)空間里, 這樣,我們就可以在程序里靈活的改動(dòng)向量的數(shù)據(jù)了.

;其中HANDLER是一個(gè)宏,用于查找中斷處理程序的入口地址。這些地址存放在

;由HandleXXX指向的表項(xiàng)中,該表定位在RAM高端,基地址為_ISR_STARTADDRESS。

;假如_ISR_STARTADDRESS為 0x800000000,當(dāng)IRQ中斷時(shí),根據(jù)b HandlerFIQ,先跳轉(zhuǎn)

;再根據(jù)^ _ISR_STARTADDRESS基地址+HandleIRQ 的偏移地址(4*6)得到的中斷地址

;0x80000000+0x00000024=0x80000024


上一頁 1 2 3 下一頁

關(guān)鍵詞: TQ2440啟動(dòng)代

評(píng)論


技術(shù)專區(qū)

關(guān)閉