查看: 1583|回复: 0

[Linux技术] FL2440启动代码分析(First Chapters)

[复制链接]
  • TA的每日心情

    2014-4-10 13:56
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-1-23 09:08:52 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 forlinx2013 于 2014-1-24 09:15 编辑

    欢迎大家来到飞凌爱板网专区,对嵌入式技术感兴趣的朋友不妨多多关注一下,我们提供了公司所有开发板的所有资料,也会更新大量技术文章,欢迎大家一块学习提高!!!

    FL2440启动代码分析(First Chapters

    启动代码主要是在主程序运行之前初始化系统硬件及软件的运行环境,它的主要功能包括以下的几个方面:
    1、建立中断向量表
    2、初始化系统堆栈
    3、应用程序执行环境初始化
    4、跳转至主函数
    第一部分
    GET option.inc           ;option.inc文件包含了开发板的配置信息—堆栈、时钟等
    GET memcfg.inc           ;存储控制文件
    GET 2440addr.inc         ;寄存器地址地址定义
    注意:   汇编不能使用include包含头文件,所有用Get,功能:引进一个被编译过的文件
            汇编也不认识*.h 文件,所有只能用*.inc
    第二部分
    ;EQU为程序中的常量、标号等定义一个等效的字符名称,相当于C语言中的define
    ;定义SDRAM工作在Refresh模式,SDRAM有两种刷新方式:autorefresh和selfrefresh,前者是在其使用过程当中每隔一段时间发出刷新指令,SDRAM刷新一行,selfrefresh是在省电模式时使用。标示:REFRESH寄存器[22]bit : 0- auto refresh; 1 - self refresh
    BIT_SELFREFRESH   EQU   (1<<22)   ;用于节电模式中,SDRAM自刷新标志位
    第三部分(简单略过)
    ;系统的工作模式设定,共七种工作模式
    USERMODE    EQU      0x10
    FIQMODE      EQU      0x11
    IRQMODE      EQU      0x12
    SVCMODE      EQU      0x13
    ABORTMODE   EQU      0x17
    UNDEFMODE   EQU      0x1b
    MODEMASK    EQU      0x1f
    NOINT         EQU       0xc0
    ;设置6种工作模式的堆栈的起始地址
    ;在option.inc中定义了_STACK_BASEADDRESS  EQU  0x33ff8000
    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   ;如果是CONFIG}= 16,表明现在处于thumb状态
    THUMBCODE  SETL  {TRUE} ;将该变量赋值为真,表示告诉系统当前想用Thumb,但实际启动时不行,只能从ARM启动后再跳转到thumb
               CODE32  ;启动时强制使用32 位ARM编译模式
                 |
    THUMBCODE SETL  {FALSE};如果系统要求是ARM 指令,则直接设置THUMBCODE
                                  为false ,说明当前的是32 位编译模式

      ;宏定义MOV_PC_LR,作用:子程序返回
       MACRO      ;宏定义
       MOV_PC_LR
       [ THUMBCODE      ;目标地址是THUMB指令
       bx lr            ;在ARM模式中,要用BX指令跳转到THUMB指令,并转换模式
       |  
       mov pc,lr   ;如果目标地址是ARM指令,则直接把函数返回地址给PC
       ]
    MEND ;宏定义结束
      ;宏定义MOVEQ_PC_LR,作用:带相等条件判断的子程序返回 。与宏定义
      ;带条件的函数返回,与MOV_PC_LR类似  
      MACRO
      MOVEQ_PC_LR
      [ THUMBCODE
    bxeq lr
    |
        moveq pc,lr
      ]
    MEND ;宏定义结束


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-30 11:56 , Processed in 0.118362 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.