欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    最为详细的vivi代码分析Word文档下载推荐.docx

    • 资源ID:4595255       资源大小:62.39KB        全文页数:59页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    最为详细的vivi代码分析Word文档下载推荐.docx

    1、三、bootloader stage1:【arch/s3c2410/head.S】首先解决一个问题,就是为什么使用head.S而不是用head.s?有了GNU AS和GNU GCC的基础,不难理解主要原因就是为了使用C预处理器的宏替换和文件包含功能(GNU AS的预处理无法完成此项功能)。可以参考前面的总结部分。这样的好处就是可以使用C预处理器的功能来提高ARM汇编的程序设计环境,更加方便。但是因为ARM汇编和C在宏替换的细节上有所不同,为了区分,引入了_ASSEMBLY_这个变量,这是通过Makefile中AFLAGS来引入的(一般在顶层Makefile中定义),具体如下:AFLAGS :=

    2、 -D_ASSEMBLY_ $(CPPFLAGS)在后面的头文件中,会看到很多#ifdef _ASSEMBLY_等的操作,就是用来区分这个细节的。在编译汇编文件时,加入AFLAGS选项,所以_ASSEMBLY_传入,也就是定义了_ASSEMBLY_;在编译C文件时,没有用AFLAGS选项,自然也就没有定义_ASSEMBLY_。由此相应的问题就比较清晰了。这个小技巧也是值得学习和借鉴的。1 首先关注一下开始的三个头文件。#include config.hlinkage.hmachine.h(1)利用source insight来查看【include/config.h】。#ifndef _CONF

    3、IG_H_#define _CONFIG_H_autoconf.h#endif /* _CONFIG_H_ */可见,config.h只是包含一个autoconf.h。而关于autoconf.h的生成,在vivi配置文件分析的时候也解释的很清楚了,在这里就不用再细分析了。需要解释的一点是,如果写一个专用的bootloader,不采用vivi的配置机制,那么配置部分就没有这么复杂了,只需要在include文件夹中包含一个配置头文件即可。现在bootloader的设计有两种趋势,一种是针对特定应用,有特殊要求,也就是“专用”。那么设计时,不需要过多的配置,只需要简单的完成引导内核的功能就可以了。二

    4、是普通应用,一般是对基本“通用”的bootloader,比如uboot等,然后根据相应的模版进行移植。这就需要了解uboot等的架构,可以进行定制和功能的增加。uboot完成的不仅仅是一个bootloader的功能,还可以提供调试等功能,所以其角色还包含驻留程序这个功能,也就是uboot真正的角色是monitor。当然,可以不加区分,统称为bootloader。而分析vivi源代码的实现,对这两个方向都有帮助。(2)【include/linkage.h】就是实现了ENTRY宏的封装。其实这个头文件也仅仅为head.S提供了服务,实际上没有必要写的这么复杂,可以简化一些。比如,我修改了这个头文件

    5、,如下:armlinuxlqm include$ cat linkage.h#ifndef _VIVI_LINKAGE_H#define _VIVI_LINKAGE_H#define SYMBOL_NAME(X) X#ifdef _STDC_#define SYMBOL_NAME_LABEL(X) X#:#else#define SYMBOL_NAME_LABEL(X) X/*/:#endif#ifdef _ASSEMBLY_#define ALIGN .align 0#define ENTRY(name) /.globl SYMBOL_NAME(name); /ALIGN;SYMBOL_NA

    6、ME_LABEL(name)在这里,要加强一下C语言宏的设计和分析能力。下面就几个点简单的分析一下,后面专门就C宏部分做个总结。关于_STDC_这个宏,是编译器自动添加的,含义就是支持标准C。如果支持标准C,那么#的作用就是“连接”,所以SYMBOL_NAME_LABEL(_start)宏展开为_start:(依我的意思理解#也就相当于分号,表示后面可以继续连接其他的一些定义),如果不支持标准C,则利用了C预处理器对注释的处理方式,就是把/*/替换为一个空格(也就是相当于展开的字符后带个空格),可以测试一下。另外,关于ENTRY宏的封装,利用了GNU AS在ARM上的相关特点。首先,利用了分号

    7、作为三条语句的连接符(包括最后一个由#展开来的分号),而分号是GNU AS汇编注释符的一种(另外一种是)。另外,关于ALIGN为什么用.align 0。这可以参考GNU AS手册,上面讲解的比较清晰,主要是为了兼容ARM本身的编译器。理解了这个也就不难得出ENTRY(_start)宏展开后的形式了。有一个技巧就是可以通过下面的命令来检测宏展开后的结果,比如:rootlqm vivi_myboard# gcc -E -D_ASSEMBLY_ -I./include arch/s3c2410/head.S aaa可以查看aaa文件的显示结果,做了一些注释:# 1 arch/s3c2410/head

    8、.Scommand line# 35 include/config.h 1# 14 include/autoconf.h# 15 2# 36 include/linkage.h# 37 include/machine.h# 19 include/platform/smdk2410.hinclude/s3c2410.h# 22 include/hardware.h# 23 include/bitfield.h# 24 # 3 include/sizes.h# 8 # 74 include/architecture.h# 75 # 20 # 38 Start of executable code宏

    9、定义展开.globl _start; .align 0; _start:.globl ResetEntryPoint; ResetEntryPoint:下面是装载中断向量表,ARM规定,在起始必须有8条跳转指令,你可以用b 标号也可以用ldr pc 标号。这样的8条规则的标志被arm定义为bootloader的识别标志,检测到这样的标志后,就可以从该位置启动。这样的做法是因为开始的时候不一定有bootloader,必须有一种识别机制,如果识别到bootloader,那么就从bootloader启动。 Exception vector table (physical address = 0x00

    10、000000) 0x00: Resetb Reset 0x04: Undefined instruction exceptionUndefEntryPoint:b HandleUndef 0x08: Software interrupt exceptionSWIEntryPoint:b HandleSWI 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)PrefetchAbortEnteryPoint:b HandlePrefetchAbort 0x10: Data Access Memory AbortDataAbortEntryPo

    11、int:b HandleDataAbort 0x14: Not usedNotUsedEntryPoint:b HandleNotUsed 0x18: IRQ(Interrupt Request) exceptionIRQEntryPoint:b HandleIRQ 0x1c: FIQ(Fast Interrupt Request) exceptionFIQEntryPoint:b HandleFIQ下面是固定位置存放环境变量 VIVI magics 0x20: magic number so we can verify that we only put.long 0 0x24: 0x28:

    12、where this vivi was linked, so we can put it in memory in the right place.long _start /_start用来指定链接后的起始装载地址装载到内存中的地址 0x2C: this contains the platform, cpu and machine id.long (1 24) | (6 16) | 193) 0x30: vivi capabilities 0x34:b SleepRamProc Start VIVI headReset: /上电后cpu会从0x0地址读取指令执行,也就是b Reset disa

    13、ble watch dog timermov r1, #0x53000000mov r2, #0x0str r2, r1# 121 disable all interruptsmov r1, #0x4A000000mov r2, #0xffffffffstr r2, r1, #0x08 /0x4A000008为中断屏蔽寄存器,将里面赋全1,表示屏蔽这32个中断源ldr r2, =0x7ffstr r2, r1, #0x1C /0x4A00001C为中断子屏蔽寄存器,里面低11位也用来表示屏蔽掉这11个中断源 initialise system clocksmov r1, #0x4C000000

    14、mvn r2, #0xff000000 /MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。也就是r2=0x00ffffffstr r2, r1, #0x00/我们可以在程序开头启动MPLL,在设置MPLL的几个寄存器后,需要等待一段 时间(Lock Time), MPLL的输出才稳定。在这段时间(Lock Time)内,FCLK停振,CPU停止工作。Lock Time的长短由寄存器LOCKTIME设定,Lock Time之后,MPLL输出正常,CPU工作在新的FCLK下,前面说过

    15、,MPLL启动后需要等待一段时间(Lock Time),使得其输出稳定。位23:12用于UPLL,位11:0用于MPLL。本实验使用确省值0x00ffffff。 ldr r2, mpll_50mhzstr r2, r1, #0x04 1:2:4mov r2, #0x3str r2, r1, #0x14/0x4C000014为分频寄存器,用于设置FCLK、HCLK、PCLK三者的比例bit2 HDIVN1,若为1,则 bit1:0 必 须 设 为 0b00 , 此 时FCLK:HCLK:PCLK=1:1/4:1/4;若为0,三者比例由bit1:0确定 bit1HDIVN,0:HCLK=FCLK;

    16、1:HCLK=FCLK/2 bit0PDIVN,0:PCLK=HCLK;PCLK=HCLK/2 本实验设为0x03,则FCLK:1/2:1/4 mrc p15, 0, r1, c1, c0, 0 read ctrl registerorr r1, r1, #0xc0000000 Asynchronousmcr p15, 0, r1, c1, c0, 0 write ctrl register上面这三句代码的意思是切换模式:If HDIVN = 1, the CPU bus mode has to be changed from the fast busmode to the asynchron

    17、ous bus mode using following instructions:MMU_SetAsyncBusMode mrc p15, 0, r0, c1, c0, 0 orr r0, r0, #R1_nF:OR:R1_iA mcr p15,0, r0, c1, c0, 0 其中的“R1_nF:R1_iA”等于0xc0000000。意思就是说,当HDIVN = 1时,CPU bus mode需要从原来的“fast bus mode”改为“asynchronous bus mode”。 now, CPU clock is 200 Mhzldr r2, mpll_200mhzstr r2,

    18、r1, #0x04 /0x4C000004为MPLLCON寄存器, 对于MPLLCON寄存器,19:12为MDIV,9:4为PDIV,1:0为SDIV。有如下计算公式: MPLL(FCLK) = (m * Fin)/(p * 2s)其中: m = MDIV + 8, p = PDIV + 2 对于本开发板,Fin = 12MHz,MPLLCON设为0x5c0040,可以计算出FCLK=200MHz,再由CLKDIVN的设置可知:HCLK=100MHz,PCLK=50MHz。# 164 bl memsetup Check if this is a wake-up from sleepldr r1

    19、, PMST_ADDR/0x560000B4为GSTATUS2寄存器,里面0:2三位有效ldr r0, r1 /将该寄存器中的值取出来保存到r0中tst r0, #(1 1)/测试r0的第一位。这位是Power_OFF reset. The reset after the wakeup from Power_OFF mode.The setting is cleared by writing 1 to this bit.TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。bne WakeupStart All LED on这

    20、里就需要对GPIO口进行控制mov r1, #0x56000000add r1, r1, #0x50 /0x56000050是GPFCON用来配置port F端口ldr r2,=0x55aastr r2, r1, #0x0/设置为010*因为每两位用来控制一个引脚,也就是将GPF4-GPF7设置为输出,将GPF0-GPF3设置为中断mov r2, #0xffstr r2, r1, #0x8 /0x56000058为GPFUP为port F的上拉寄存器,全设置为1表示禁止上拉功能mov r2, #0x00str r2, r1, #0x4 /0x56000054是GPFDAT,总共8位有效,每位控

    21、制一个引脚,主要是将GPF4-GPF7数据位全设置为0而这四个引脚是用来控制板子上4个LED,置0则表示亮。# 230 set GPIO for UARTmov r1, #0x56000000add r1, r1, #0x70 /0x56000070为GPHCON 用来配置port H 而port H主要就是来控制UART的各个引脚如:UART中接收和发送端口RXDn和TXDn,当然还有自动流控制模式的nRTS0和nCTS0端口。ldr r2, gpio_con_uart /我们可以看到 gpio_con_uart: .longvGPHCON gpio_up_uart:.longvGPHUP

    22、而在platform中的smdk2410.h中定义了这两个值#define vGPHCON0x0016faaa 表示GPHCON控制11个引脚,如GPH2若设置为10则表示TXD0.类似,具体的查看数据手册#define vGPHUP0x000007ff /同样将这11位的引脚上拉禁止str r2, r1, #0x0ldr r2, gpio_up_uartstr r2, r1, #0x8 /上面也是来配置串口所用到的GPIO口,因为串口的输入输出口都是利用到GPIObl InitUART# 259 bl copy_myself jump to ramldr r1, =on_the_ramadd pc, r1, #0nop1: b 1b infinite loopon_the_ram:# 279 get read to call C functions开始调用C函数之前就需要将一些参数准备好,如堆栈要准备好函数调用时需要进出栈ldr sp, DW_STACK_START setup stack pointermov fp, #0 no previous frame, so fp=0mov a2, #0 set argv to NULLbl main call m


    注意事项

    本文(最为详细的vivi代码分析Word文档下载推荐.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开