ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:28.11KB ,
资源ID:19816665      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19816665.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(s3c2440启动文件详细分析Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

s3c2440启动文件详细分析Word下载.docx

1、IRQMODE 0x12SVCMODE 0x13ABORTMODE 0x17UNDEFMODE 0x1bMODEMASK 0x1fCPSR中的I位和F位置1,表示禁止任何中断NOINT 0xc0定义了7种处理器模式下的栈的起始地址,其中用户模式和系统模式共有一个栈空间_STACK_BASEADDRESS在option.inc文件内定义,值为0x33ff8000The location of stacksUserStack (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 SVCStack (_STACK_BASEADDRESS-0x2800) ;0x33ff580

2、0 UndefStack (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 AbortStack (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 IRQStack (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 FIQStack (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ARM处理器的两种工作状态:16位和32位编译器有相对应的用16位和32位两种编译方式这段的目的是统一目前的处理器工作状态和软件编译方式Check if tasm.exe(armasm -16 .ADS

3、 1.0) is used. GBLL THUMBCODE ;声明一个全局逻辑变量 CONFIG = 16if CONFIG = 16THUMBCODE SETL TRUETHUMBCODE = TRUE CODE32指示编译器为ARM指令 |else FALSETHUMBCODE = FALSE 宏定义,在后面出现MOV_PC_LR时,这个宏会被自动展开该宏的作用是跳出子程序,返回被调用处 MACRO MOV_PC_LR THUMBCODEif THUMBCODE = TRUE bx lrelse 即THUMBCODE = FALSE mov pc,lr MEND该宏定义的作用是有条件地(当

4、Z=1时)跳出子程序,返回被调用处 MOVEQ_PC_LR THUMBCODE bxeq lr | moveq pc,lr该宏定义是把中断服务程序的首地址装载到pc中在后面当遇到HandlerXXX HANDLER HandleXXX时,该宏被展开注意:HANDLER前的符号HandlerXXX比其后的符号HandleXXX多了一个rHandlerXXX为ARM体系中统一定义的几种异常中断HandleXXX为每个ARM处理器各自定义的中断,见该文件最后部分的中断向量表$HandlerLabel HANDLER $HandleLabel$HandlerLabel sub sp,sp,4 ;ATP

5、CS规定数据栈为FD类型即栈指针指向栈顶元素,数据栈向内存地址减小的方向增长该语句是使栈地址减小4个字节,以留出空间装载中断服务函数首地址 stmfd sp!,r0 ;由于要利用r0寄存器来传递数据,所以要保存r0数据,使其入栈 ldr r0,=$HandleLabel把HandleXXX的地址装到r0 r0,r0装载中断服务函数的起始地址 str r0,sp,4中断函数首地址入栈 ldmfd,r0,pc ;将事先保存的r0数据和中断函数首地址出栈并使系统跳转到相应的中断处理函数导入连接器事先定义好的运行域中三个段变量ARM的可执行映像文件由RO、RW、ZI三个段组成RO为代码段,RW为已初始

6、化的全局变量,ZI为未初始化的全局变量 IMPORT |Image$RO$Base|RO段起始地址 |Image$RO$Limit|RO段结束地址加1,等于RW段起始地址 |Image$RW$Base|RW段起始地址 |Image$ZI$Base|ZI段起始地址 |Image$ZI$Limit|ZI段结束地址加1导入两个关于MMU的函数,用于设置时钟模式为异步模式和快速总线模式 MMU_SetAsyncBusMode MMU_SetFastBusMode导入Main,它为C语言程序入口函数 Main The main entry of mon program导入用于复制从Nand Flash中

7、的映像文件到SDRAM中的函数 RdNF2SDRAM Copy Image from Nand Flash to SDRAM定义代码段,名为Init AREA Init,CODE,READONLY在入口处(0x0)开始的8个字单元空间内,存放的是ARM异常中断向量表,每个字单元空间都是一条跳转指令,当异常发生时,ARM会自动跳转到相应的中断向量处,并由该处的跳转指令再跳转到相应的执行函数处 ENTRY程序入口处 EXPORT _ENTRY导出_ENTRY,即导出代码段入口地址_ENTRY主要用于MMUResetEntry1)The code, which converts to Big-end

8、ian, 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.在0x0处的异常中断是复位异常中断,是上电后执行的第一条指令变量ENDIAN_CHANG

9、E用于标记是否要从小端模式改变为大端模式,因为编译器初始模式是小端模式,如果要用大端模式,就要事先把该变量设置为TRUE,否则为FLASE变量ENTRY_BUS_WIDTH用于设置总线的宽度,因为用16位和8位宽度来表示32位数据时,在大端模式下,数据的含义是不同的由于要考虑到大端和小端模式,以及总线的宽度,因此该处看似较复杂,其实只是一条跳转指令:当为大端模式时,跳转到ChangeBigEndian函数处,否则跳转到ResetHandler函数处 ASSERT :DEF:ENDIAN_CHANGE判断是否定义了ENDIAN_CHANGE如果没有定义,则报告该处错误信息 ENDIAN_CHAN

10、GEif ENDIAN_CHANGE =TRUEENTRY_BUS_WIDTH判断是否定义了ENTRY_BUS_WIDTH ENTRY_BUS_WIDTH=32if ENTRY_BUS_WIDTH =32跳转到ChangeBigEndian(ChangeBigEndian在0x24),因此该条指令的机器码为0xea000007所以该语句与在该处(即0x0处)直接放入0xea000007数据(即DCD 0xea000007)作用相同 b ChangeBigEndian ENTRY_BUS_WIDTH=16if ENTRY_BUS_WIDTH =16在小端模式下,用16位或8位数据总线宽度表示32

11、位数据,与用32位总线宽度表示32位数据,格式完全一致。但在大端模式下,格式就会发生变化在复位时,系统默认的是小端模式,所以就要人为地改变数据格式,使得用16位大端数据表示的32位数据也能被小端模式的系统识别该语句的目的也是跳转到ChangeBigEndian,即机器码也应该是0xea000007,但为了让小端模式系统识别,就要把机器码的顺序做一下调整,改为0x0007ea00,那么我们就可以用DCD 0x0007ea00把机器码装载进去了,但由于该处不能使用DCD伪指令,因此我们就要用一条真实的指令来代替DCD 0x0007ea00,即该指令编译后的机器码也为0x0007ea00,而ande

12、q r14,r7,r0,lsl 20就是一条编译后机器码为0x0007ea00的指令,所以我们在该处写上该条指令 andeq r14,r7,r0,lsl 20DCD 0x0007ea00 ENTRY_BUS_WIDTH=8if ENTRY_BUS_WIDTH =8该语句的分析与上一段代码的分析相似streq r0,r0,-r10,ror 1编译后的机器码为0x070000ea streq r0,r0,-r10,ror 1 ;DCD 0x070000eaelse 即ENDIAN_CHANGE =FALSE ResetHandler跳转到ResetHandler处,复位 HandlerUndef未

13、定义 HandlerSWI ;软件中断 HandlerPabort指令预取中止 HandlerDabort数据访问中止 .保留,跳转到自身地址处,即进入死循环 HandlerIRQ ;外部中断请求 HandlerFIQ ;快速中断请求以上为异常中断向量表跳转到EnterPWDN,处理电源管理的其他非正常模式,在C语言程序段中被调用该处地址为0x20,至于为什么要在该处执行,我认为可能是该处离异常中断向量表最近吧 EnterPWDN Must be 0x20.由0x0跳转至此,目的是把小端模式改为大端模式,即把CP15中的寄存器C1中的第7位置1ChangeBigEndian0x24if ENT

14、RY_BUS_WIDTH = 32执行mrc p15,0,r0,c1,c0,0,得到CP15中的寄存器C1,放入r0中由于mrc p15,0,r0,c1,c0,0的机器码为0xee110f10因此DCD 0xee110f10的意思就是mrc p15,0,r0,c1,c0,0。下同 DCD 0xee110f100xee110f10 = mrc p15,0,r0,c1,c0,0执行orr r0,r0,0x80,置r0中的第7位为1,表示选择大端模式 0xe3800080 ;0xe3800080 = orr r0,r0,0x80; /Big-endian执行mcr p15,0,r0,c1,c0,0,

15、把r0写入CP15中的寄存器C1 0xee010f100xee010f10 = mcr p15,0,r0,c1,c0,0if ENTRY_BUS_WIDTH = 16由于此时系统还不能识别16位或8位大端模式下表示的32为数据因此还需人为地进行数据调整,即把0xee110f10变为0x0f10ee11然后用DCD指令存入该数据。 DCD 0x0f10ee11 DCD 0x0080e380 DCD 0x0f10ee01if ENTRY_BUS_WIDTH = 8 DCD 0x100f11ee DCD 0x800080e3 DCD 0x100f01ee相当于NOP指令作用是等待系统从小端模式向大端

16、模式转换此后系统就能够自动识别出不同总线宽度下的大端模式,因此以后就无需再人为调整指令了 DCD 0xffffffffswinv 0xffffff is similar with NOP and run well in both endian mode. DCD 0xffffffff b ResetHandler跳转到ResetHandler当系统进入异常中断后,由存放在0x00x1C处的中断向量地址中的跳转指令,跳转到此处相应的位置,并由事先定义好的宏定义再次跳转到相应的中断服务程序中HandlerFIQ HANDLER HandleFIQHandlerIRQ HANDLER HandleI

17、RQHandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort HANDLER HandlePabort下面这段代码是用于处理非向量中断,即由软件程序来判断到底发生了哪种中断,然后跳转到相应地中断服务程序中具体地说就是,当发生中断时,会置INTOFFSET寄存器相应的位为1,然后通过查表(见该程序末端部分的中断向量表),找到相对应的中断入口地址观察中断向量表,会发现它与INTOFFSET寄存器中的中断源正好相对应,即向量表的顺序与INTOF

18、FSET寄存器中的中断源的由小到大的顺序一致,因此我们可以用基址加变址的方式很容易找到相对应的中断入口地址。其中基址为向量表的首个中断源地址,变址为INTOFFSET寄存器的值乘以4(因为系统是用4个字节单元来存放一个中断向量)IsrIRQ sp,sp,4在栈中留出4个字节空间,以便保存中断入口地址,r8-r9由于要用到r8和r9,因此保存这两个寄存器内的值 r9,=INTOFFSET把INTOFFSET寄存器地址装入r9内 r9,r9读取INTOFFSET寄存器内容 r8,=HandleEINT0得到中断向量表的基址 add r8,r8,r9,lsl 2用基址加变址的方式得到中断向量表的地址

19、 r8,r8得到中断服务程序入口地址 r8,sp,8使中断服务程序入口地址入栈,r8-r9,pc使r8,r9和入口地址出栈,并跳到中断服务程序中定义一个数据缓冲池,供ldr伪指令使用 LTORG= ENTRY系统上电或复位后,由0x0处的跳转指令,跳转到该处开始真正执行系统的初始化工作ResetHandler在系统初始化过程中,不需要看门狗,因此关闭看门狗功能 r0,=WTCONwatch dog disable r1,=0x0 r1,r0同样,此时也不应该响应任何中断,因此屏蔽所有中断,以及子中断 r0,=INTMSK r1,=0xffffffffall interrupt disable r0,=INTSUBMSK r1,=0x7fffall sub interrupt disable由于启动文件是无法仿真的,因此为了判断该文件中语句的正确与否,往往在需要观察的地方加上一段点亮LED的程序,这样就可以知道程序是否已经执行到此处下面方括号内的程序就是点亮LED的小程序 FALSErGPFDAT = (rGPFDAT & (0xf4) | (data

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1