您的位置 首页 动态

TQ2440发动代码剖析(三)

初始化程序中必须指明入口地址,因为处理器复位(仿真时,装载image)后PC要找到入口开始执行代码,当各种异常或是中断产生的时候也要找…

初始化程序中有必要指明进口地址,由于处理器复位(仿真时,装载image)后PC 要找到进口开端碑文代码,当各种反常或是中止产生的时分也要找到各个反常的进口开端碑文代

码。从这儿开端便是真实的代码进口了!

AREA 伪指令用于界说一个代码段或数据段.ARM 汇编程序规划选用分段式规划,一
个 ARM 源程序至少需求一个代码段,大的程序能够包括多少个代码段及数据段.

CODE 为界说代码段.默许特点为 READONLY;

READONLY 指定本段为只读,代码段的默许特点为READONLY;

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

;板子上电和复位后程序开端从坐落0x0处开端碑文,硬件刚刚上电复位后程序从这儿开端碑文跳转到标为ResetHandler处碑文

;DCD用于分配一段字内存单片,并用后边的伪指令初始化,分配字节由expr 个数决议

AREA Init,CODE,READONLY;声明一个名为Init的代码段, ;Init 初始化程序

ENTRY 程序的进口点,(调试用)

;ENTRY仅仅界说一个一般的进口点,且在程序中能够多处界说,假如要使用它作为整

个映像文件的仅有进口点,还需求设置链接器中的相关选项。

EXPORT __ENTRY

__ENTRY

ResetEntry ;复位后的进口

;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 ;跳转到ChangeBigEndian (见下面赤色代码),碑文DCD 0xea000007 改动巨细端数据形式

] ;end if

[ ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH=16

andeq r14,r7,r0,lsl #20 ;当标志状况寄存器CPSR的Z位=1时,r14=r7+r0逻辑左移20位,碑文DCD 0x0007ea00改动巨细端形式

] ;end if

[ ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8

streq r0,[r0,-r10,ror #1] ; 当标志状况寄存器CPSR的Z位=1时…,碑文DCD 0x070000ea 改动巨细端形式

]

| ;ELSE 即假如没界说ENDIAN_CHANGE

b ResetHandler;复位反常,开发板上电或复位时进入0x00

]

中止向量表一般坐落发动代码的开端部分,它是用户程序与发动代码之间以及发动代码

的各部分之间联络的枢纽。它由一个一个的跳转函数组成,它就象一个一般的散转函数,只

不过散转的进程中有硬件机制参加,当体系产生反常时,ARM 处理器会通过硬件机制强制

将PC 指针指向中止向量表中对应的反常跳转函数存储的地址,然后程序会跳转到相应的中

断服务程序去碑文。

b HandlerUndef ;handler for Undefined mode 未界说反常,遇到无法辨认的指令时0x04

b HandlerSWI ;handler for SWI interrupt,软中止反常0x08

b HandlerPabort ;handler for PAbort指令预取过错时进入0x0c 处理停止程序拜访停止形式

b HandlerDabort ;handler for DAbort数据拜访不能完结时进入0x10 处理数据拜访停止形式

b . ;reserved, 保存 0x14 “.”代表指令的地址 ,即一共进行死循环

b HandlerIRQ ;handler for IRQ interrupt产生IRQ 中止时进入0x18

b HandlerFIQ ;handler for FIQ interrupt产生FIQ 中止时进入0x1c

;@0x20 “@” 存储区方位计数器的当时值

b EnterPWDN ; Must be @0x20.

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

159 ;下面是改动巨细端的程序,这儿选用直接界说机器码的方法,至于说为什么这么做

160 ;就得问三星了横竖咱们程序里这段代码也不会去碑文,不必去管它

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

ChangeBigEndian ;改动巨细端数据形式

;@0x24

[ ENTRY_BUS_WIDTH=32

DCD用于分配一段字内存单元,并用伪指令中的expr初始化.DCD伪指令分配的内存
需求字对齐,一般可用来界说数据表格或其它常数.&与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 ;复位处理程式

;进入掉电形式功用

; 1. SDRAM 有必要在自改写形式.

; 2. 一切中止有必要屏蔽 for SDRAM/DRAM self-refresh.

; 3. LCD 封闭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***之间的联络

HandlerFIQ HANDLER HandleFIQ ;HandlerIRQ 行号 HANDLER 宏名 HandleIRQ 导入的形参

Ha ndlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/264571.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部