新聞中心

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

        TQ2440啟動代碼分析(三)

        作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
        初始化程序中必須指明入口地址,因為處理器復(fù)位(仿真時,裝載image)后PC 要找到入口開始執(zhí)行代碼,當(dāng)各種異常或是中斷產(chǎn)生的時候也要找到各個異常的入口開始執(zhí)行代

        碼。從這里開始就是真正的代碼入口了!

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

        AREA 偽指令用于定義一個代碼段或數(shù)據(jù)段.ARM 匯編程序設(shè)計采用分段式設(shè)計,一
        個 ARM 源程序至少需要一個代碼段,大的程序可以包含多少個代碼段及數(shù)據(jù)段.

        CODE 為定義代碼段.默認(rèn)屬性為 READONLY;

        READONLY 指定本段為只讀,代碼段的默認(rèn)屬性為READONLY;

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

        ;板子上電和復(fù)位后程序開始從位于0x0處開始執(zhí)行,硬件剛剛上電復(fù)位后程序從這里開始執(zhí)行跳轉(zhuǎn)到標(biāo)為ResetHandler處執(zhí)行

        ;DCD用于分配一段字內(nèi)存單片,并用后面的偽指令初始化,分配字節(jié)由expr 個數(shù)決定

        AREA Init,CODE,READONLY;聲明一個名為Init的代碼段, ;Init 初始化程序

        ENTRY 程序的入口點,(調(diào)試用)

        ;ENTRY只是定義一個普通的入口點,且在程序中可以多處定義,如果要使用它作為整

        個映像文件的唯一入口點,還需要設(shè)置鏈接器中的相關(guān)選項。

        EXPORT __ENTRY

        __ENTRY

        ResetEntry ;復(fù)位后的入口

        ;1)The code, which converts to Big-endian, should be in little endian code.

        ;2)The following little endian code will be compiled in Big-Endian mode.

        ; The code byte order should be changed as the memory bus width.

        ;3)The pseudo instruction,DCD can not be used here because the linker generates error.

        ASSERT :DEF:ENDIAN_CHANGE

        ;ASSERT斷言錯誤偽指令,這里表示是否定義過ENDIAN_CHANGE

        [ ENDIAN_CHANGE ;如果定義了ENDIAN_CHANGE

        ASSERT :DEF:ENTRY_BUS_WIDTH ;這里表示是否定義過ENTRY_BUS_WIDTH

        ;如果沒有定義ENTRY_BUS_WIDTH就報錯

        [ ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32

        b ChangeBigEndian ;跳轉(zhuǎn)到ChangeBigEndian (見下面紅色代碼),執(zhí)行DCD 0xea000007 改變大小端數(shù)據(jù)模式

        ] ;end if

        [ ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH=16

        andeq r14,r7,r0,lsl #20 ;當(dāng)標(biāo)志狀態(tài)寄存器CPSR的Z位=1時,r14=r7+r0邏輯左移20位,執(zhí)行DCD 0x0007ea00改變大小端模式

        ] ;end if

        [ ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8

        streq r0,[r0,-r10,ror #1] ; 當(dāng)標(biāo)志狀態(tài)寄存器CPSR的Z位=1時…,執(zhí)行DCD 0x070000ea 改變大小端模式

        ]

        | ;ELSE 即如果沒定義ENDIAN_CHANGE

        b ResetHandler;復(fù)位異常,開發(fā)板上電或復(fù)位時進入0x00

        ]

        中斷向量表一般位于啟動代碼的開始部分,它是用戶程序與啟動代碼之間以及啟動代碼

        的各部分之間聯(lián)系的紐帶。它由一個一個的跳轉(zhuǎn)函數(shù)組成,它就象一個普通的散轉(zhuǎn)函數(shù),只

        不過散轉(zhuǎn)的過程中有硬件機制參與,當(dāng)系統(tǒng)發(fā)生異常時,ARM 處理器會通過硬件機制強制

        將PC 指針指向中斷向量表中對應(yīng)的異常跳轉(zhuǎn)函數(shù)存儲的地址,然后程序會跳轉(zhuǎn)到相應(yīng)的中

        斷服務(wù)程序去執(zhí)行。

        b HandlerUndef ;handler for Undefined mode 未定義異常,遇到無法識別的指令時0x04

        b HandlerSWI ;handler for SWI interrupt,軟中斷異常0x08

        b HandlerPabort ;handler for PAbort指令預(yù)取錯誤時進入0x0c 處理終止程序訪問終止模式

        b HandlerDabort ;handler for DAbort數(shù)據(jù)訪問不能完成時進入0x10 處理數(shù)據(jù)訪問終止模式

        b . ;reserved, 保留 0x14 "."代表指令的地址 ,即表示進行死循環(huán)

        b HandlerIRQ ;handler for IRQ interrupt發(fā)生IRQ 中斷時進入0x18

        b HandlerFIQ ;handler for FIQ interrupt發(fā)生FIQ 中斷時進入0x1c

        ;@0x20 "@" 存儲區(qū)位置計數(shù)器的當(dāng)前值

        b EnterPWDN ; Must be @0x20.

        158 ;===============================================================

        159 ;下面是改變大小端的程序,這里采用直接定義機器碼的方式,至于說為什么這么做

        160 ;就得問三星了反正我們程序里這段代碼也不會去執(zhí)行,不用去管它

        161 ;===============================================================

        ChangeBigEndian ;改變大小端數(shù)據(jù)模式

        ;@0x24

        [ ENTRY_BUS_WIDTH=32

        DCD用于分配一段字內(nèi)存單元,并用偽指令中的expr初始化.DCD偽指令分配的內(nèi)存
        需要字對齊,一般可用來定義數(shù)據(jù)表格或其它常數(shù).&與DCD 同義.

        DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0

        DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; //Big-endian

        DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0

        ]

        [ ENTRY_BUS_WIDTH=16

        DCD 0x0f10ee11

        DCD 0x0080e380

        DCD 0x0f10ee01

        ]

        [ ENTRY_BUS_WIDTH=8

        DCD 0x100f11ee

        DCD 0x800080e3

        DCD 0x100f01ee

        ]

        DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode.

        DCD 0xffffffff

        DCD 0xffffffff

        DCD 0xffffffff

        DCD 0xffffffff

        b ResetHandler ;復(fù)位處理程式

        ;進入掉電模式功能

        ; 1. SDRAM 必須在自刷新模式.

        ; 2. 所有中斷必須屏蔽 for SDRAM/DRAM self-refresh.

        ; 3. LCD 關(guān)閉for SDRAM/DRAM self-refresh.

        ; 4. The I-cache 可能需要開啟.

        ; 5. The location of the following code may have not to be changed.

        ;如第前面所說,這里采用HANDLER宏去建立Hander***和Handle***之間的聯(lián)系

        HandlerFIQ HANDLER HandleFIQ ;HandlerIRQ 行號 HANDLER 宏名 HandleIRQ 導(dǎo)入的形參

        Ha ndlerIRQ HANDLER HandleIRQ

        HandlerUndef HANDLER HandleUndef

        HandlerSWI HANDLER HandleSWI

        HandlerDabort HANDLER HandleDabort

        HandlerPabort HANDLER HandlePabort



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

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 习水县| 霍林郭勒市| 稻城县| 昌黎县| 沧州市| 彭阳县| 安吉县| 青神县| 民勤县| 姜堰市| 铁力市| 龙门县| 项城市| 郯城县| 临沂市| 东至县| 岳西县| 肇东市| 太谷县| 酒泉市| 田林县| 顺昌县| 花莲市| 老河口市| 蕲春县| 论坛| 成都市| 金湖县| 大方县| 饶阳县| 寿光市| 噶尔县| 左权县| 临沂市| 宜君县| 宁强县| 天祝| 离岛区| 平山县| 鹿泉市| 霍州市|