新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > TQ2440啟動代碼分析(一)

        TQ2440啟動代碼分析(一)

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

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

        本文引用地址:http://www.104case.com/article/201611/321668.htm

        ; 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


        上一頁 1 2 3 下一頁

        關鍵詞: TQ2440啟動代

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 太白县| 九江县| 积石山| 陆河县| 南康市| 车险| 沈丘县| 谢通门县| 榆社县| 丹江口市| 当雄县| 阿拉尔市| 闻喜县| 洪洞县| 海伦市| 砀山县| 凤凰县| 龙岩市| 韶山市| 肥东县| 定远县| 盘山县| 吐鲁番市| 磐石市| 雷山县| 广南县| 友谊县| 浪卡子县| 鱼台县| 东乡| 泰和县| 康定县| 故城县| 巧家县| 襄垣县| 木兰县| 奉新县| 沈丘县| 江永县| 兴宁市| 小金县|