1 学习笔记——start.S文件分析

  • 版本号:uboot 2010.06
  • 汇编语言详细分析
  • start.S文件在\arch\arm\cpu\arm926ejs目录下
  •  
  • #include <config.h>
  • #include <common.h>
  • #include <version.h>
  •  
  • #if defined(CONFIG_OMAP1610)
  • #include <./configs/omap1510.h>
  • #elif defined(CONFIG_OMAP730)
  • #include <./configs/omap730.h>
  • #endif  //此段和OMAP板子的移植有关系,这里不用
  • /************************************************************************
  •  *Jump vector table as in table 3.1 in [1]向量表的填写
  • *************************************************************************/
  • .globl _start  //定义全局变量
  • _start://上电开始执行第一句
  •        b     reset
  • #ifdef CONFIG_PRELOADER  //9260中未定义,故不用分析
  • /* No exception handlersin preloader */
  •        ldr   pc, _hang
  •        ldr   pc, _hang
  •        ldr   pc, _hang
  •        ldr   pc, _hang
  •        ldr   pc, _hang
  •        ldr   pc, _hang
  •        ldr   pc, _hang
  • _hang:
  •        .word      do_hang
  • /* pad to 64 byteboundary */
  •        .word      0x12345678
  •        .word      0x12345678
  •        .word      0x12345678
  •        .word      0x12345678
  •        .word      0x12345678
  •        .word      0x12345678
  •        .word      0x12345678
  • #else
  •        ldr   pc, _undefined_instruction//安装向量表
  •        ldr   pc, _software_interrupt
  •        ldr   pc, _prefetch_abort
  •        ldr   pc, _data_abort
  •        ldr   pc, _not_used
  •        ldr   pc, _irq
  •        ldr   pc, _fiq
  • _undefined_instruction:
  •        .wordundefined_instruction
  • _software_interrupt:
  •        .wordsoftware_interrupt
  • _prefetch_abort:
  •        .wordprefetch_abort
  • _data_abort:
  •        .worddata_abort
  • _not_used:
  •        .wordnot_used
  • _irq:
  •        .wordirq
  • _fiq:
  •        .wordfiq
  • #endif     /*CONFIG_PRELOADER */
  •        .balignl16,0xdeadbeef
  • /**************************************************************************
  •  *Startup Code (reset vector)
  •  * doimportant init only if we don't start from memory!
  •  *setup Memory and board specific bits prior to relocation.
  •  *relocate armboot to ram
  •  *setup stack
  • **************************************************************************/
  • _TEXT_BASE:  //标号TEXT_BASE = 0x23f00000
  •        .word      TEXT_BASE
  • .globl _armboot_start
  • _armboot_start:
  •        .word _start
  • /* These are defined in the board-specificlinker script.*/
  • .globl _bss_start
  • _bss_start:
  •        .word__bss_start
  • .globl _bss_end
  • _bss_end:
  •        .word_end
  • #ifdef CONFIG_USE_IRQ
  • /* IRQ stack memory(calculated at run-time) */
  • .globl IRQ_STACK_START
  • IRQ_STACK_START:
  •        .word      0x0badc0de
  • /* IRQ stack memory(calculated at run-time) */
  • .globl FIQ_STACK_START
  • FIQ_STACK_START:
  •        .word 0x0badc0de
  • #endif
  • /* the actual reset code*/
  •  
  • reset:
  •        /*setthe cpu to SVC32 mode*/
  •        mrs  r0,cpsr //传送CPSR的内容到R0
  •        bic   r0,r0,#0x1f//位清零    r0=xxx0 0000
  •        orr   r0,r0,#0xd3 //逻辑位 或 r0=11x1  xx11   经过以上两步后R0=11X1 0011
  •        msr  cpsr,r0  //传送R0的内容到CPSR
  •        /**we do sys-critical inits only at reboot,not when booting from ram!*/
  • #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  •        bl    cpu_init_crit// BL跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容
  • #endif
  • #ifndef CONFIG_SKIP_RELOCATE_UBOOT
  • relocate:                       /*relocate U-Boot to RAM       */
  •        adr   r0, _start        /*r0 <- current position of code   */
  •        ldr   r1, _TEXT_BASE         /* test if we run from flash or RAM */
  •        cmp     r0, r1                  /* don't reloc duringdebug         */
  •        beq     stack_setup
  •        ldr   r2, _armboot_start
  •        ldr   r3, _bss_start
  •        sub  r2, r3, r2        /*r2 <- size of armboot            */
  •        add  r2, r0, r2        /*r2 <- source end address         */
  • copy_loop:
  •        ldmia      r0!, {r3-r10}         /* copy from source address [r0]    */
  •        stmia       r1!, {r3-r10}         /* copy to   targetaddress [r1]    */
  •        cmp r0, r2                    /*until source end addreee [r2]    */
  •        ble   copy_loop
  • #endif     /*CONFIG_SKIP_RELOCATE_UBOOT */
  •        /*Set up the stack                                         */
  • stack_setup:
  •        ldr   r0, _TEXT_BASE         /* upper 128 KiB: relocated uboot   */
  •        sub  sp, r0, #128           /*leave 32 words for abort-stack   */
  • #ifndef CONFIG_PRELOADER
  •        sub  r0, r0,#CONFIG_SYS_MALLOC_LEN      /* mallocarea                      */
  •        sub  r0, r0, #CONFIG_SYS_GBL_DATA_SIZE/* bdinfo                        */
  • #ifdef CONFIG_USE_IRQ
  •        sub  r0, r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
  • #endif
  • #endif /*CONFIG_PRELOADER */
  •        sub  sp, r0, #12             /*leave 3 words for abort-stack    */
  •        bic   sp, sp, #7        /*8-byte alignment for ABI compliance */
  • clear_bss:
  •        ldr   r0, _bss_start         /* find start of bss segment        */
  •        ldr   r1, _bss_end          /*stop here                        */
  •        mov r2, #0x00000000           /*clear                            */
  • #ifndef CONFIG_PRELOADER
  • clbss_l:str       r2, [r0]           /*clear loop...                    */
  •        add  r0, r0, #4
  •        cmp r0, r1
  •        ble   clbss_l
  •        bl coloured_LED_init
  •        bl red_LED_on
  • #endif /*CONFIG_PRELOADER */
  •        ldr   pc, _start_armboot
  • _start_armboot:
  • #ifdef CONFIG_NAND_SPL
  •        .word nand_boot
  • #else
  •        .wordstart_armboot
  • #endif /* CONFIG_NAND_SPL */
  • /***************
  • * CPU_init_critical registers
  • * setup important registers
  • * setup memory timing
  • ****************/
  • #ifndef CONFIG_SKIP_LOWLEVEL_INIT //9260 h文件中有定义
  • cpu_init_crit:
  •        /**flush v4 I/D caches*/
  •        mov r0, #0
  •        mcr  p15, 0, r0, c7, c7, 0       /* flush v3/v4 cache */
  •        mcr  p15, 0, r0, c8, c7, 0       /* flush v4 TLB */
  •        /**disable MMU stuff and caches*/
  •        mrc  p15, 0, r0, c1, c0, 0
  •        bic   r0, r0, #0x00002300      /* clear bits 13, 9:8 (--V- --RS) */
  •        bic   r0, r0, #0x00000087      /* clear bits 7, 2:0 (B--- -CAM)*/
  •        orr   r0, r0, #0x00000002      /* set bit 2 (A) Align */
  •        orr   r0, r0, #0x00001000      /* set bit 12 (I) I-Cache */
  •        mcr  p15, 0, r0, c1, c0, 0 //将R0中数据传送到协处理器P15的寄存器c1和C0中
  •        /**Go setup Memory and board specific bits prior to relocation.*/
  •        mov ip, lr              /*perserve link reg across call */
  • //将lr复制到ip中,保存当前的lr。即是当前的pc值,因为再下一条指令又要进行跳转了
  • //ip中保存了reset中调用cpu_init_crit的下一条指令地址
  •        bl    lowlevel_init   /* go setup pll,mux,memory */
  •        mov lr, ip              /*restore link *///lowlevel_init返回后,执行这条指令。将ip传给lr
  •        mov pc, lr              /*back to my caller */
  • //再将lr传给pc,这样就回到了reset的下一条指令处
  • #endif /* CONFIG_SKIP_LOWLEVEL_INIT */
  •  
  • lowlevel_init函数标记在lowlevel_init.S文件中,
  • 在u-boot-2010.06\arch\arm\cpu\arm926ejs\at91目录下
  • #include <config.h>
  • #include <asm/arch/hardware.h>
  • #include <asm/arch/at91_pmc.h>
  • #include <asm/arch/at91_wdt.h>
  • #include <asm/arch/at91_pio.h>
  • #include <asm/arch/at91_matrix.h>
  • #include <asm/arch/at91sam9_sdramc.h>
  • #include <asm/arch/at91sam9_smc.h>
  • #include <asm/arch/at91_rstc.h>
  • #ifdef CONFIG_AT91_LEGACY
  • #include <asm/arch/at91sam9_matrix.h>
  • #endif
  • #ifndef CONFIG_SYS_MATRIX_EBICSA_VAL
  • #define CONFIG_SYS_MATRIX_EBICSA_VALCONFIG_SYS_MATRIX_EBI0CSA_VAL
  • #endif
  • _TEXT_BASE:
  •        .word      TEXT_BASE
  • .globl lowlevel_init
  • .type lowlevel_init,function
  • lowlevel_init:
  •        mov r5, pc             /*r5 = POS1 + 4 current */
  • POS1:
  •        ldr   r0, =POS1      /*r0 = POS1 compile */
  •        ldr   r2, _TEXT_BASE
  •        sub  r0, r0, r2 /*r0 = POS1-_TEXT_BASE (POS1 relative) */
  •        sub  r5, r5, r0 /*r0 = TEXT_BASE-1 */
  •        sub  r5, r5, #4 /*r1 = text base - current */
  •        /* memory controlconfiguration 1 *///内存控制配置1
  •        ldr   r0, =SMRDATA
  •        ldr   r2, =SMRDATA1
  •        ldr   r1, _TEXT_BASE
  •        sub  r0, r0, r1
  •        sub  r2, r2, r1
  •        add  r0, r0, r5
  •        add  r2, r2, r5
  • 0:
  •        /*the address */
  •        ldr   r1, [r0], #4
  •        /*the value */
  •        ldr   r3, [r0], #4
  •        str    r3, [r1]
  •        cmp r2, r0
  •        bne  0b
  • /*----------------------------------------------------------------------------
  •  *PMC Init Step 1.
  • * - Check if the PLL is already initialized
  •  *----------------------------------------------------------------------------*/
  •        ldr   r1, =(AT91_ASM_PMC_MCKR) //0xfffffc00(AT91_PMC_BASE+ 0x30)
  •        ldr   r0, [r1]
  •        and  r0, r0, #3
  •        cmp r0, #0
  •        bne  PLL_setup_end
  • /*---------------------------------------------------------------------------
  •  * -Enable the Main Oscillator
  •  *---------------------------------------------------------------------------*/
  •        ldr   r1, =(AT91_ASM_PMC_MOR) //(AT91_PMC_BASE +0x20)
  •        ldr   r2, =(AT91_ASM_PMC_SR)   //(AT91_PMC_BASE + 0x68)
  •        /*Main oscillator Enable register PMC_MOR: */
  •        ldr   r0, =CONFIG_SYS_MOR_VAL
  •        str    r0, [r1]
  •        /*Reading the PMC Status to detect when the Main Oscillator is enabled */
  •        mov r4, #AT91_PMC_IXR_MOSCS
  • MOSCS_Loop:
  •        ldr   r3, [r2]
  •        and  r3, r4, r3
  •        cmp r3, #AT91_PMC_IXR_MOSCS
  •        bne  MOSCS_Loop
  • /* ----------------------------------------------------------------------------
  •  *PMC Init Step 2.
  • * Setup PLLA
  •  *----------------------------------------------------------------------------*/
  •        ldr   r1, =(AT91_ASM_PMC_PLLAR)   // (AT91_PMC_BASE+ 0x28)
  •        ldr   r0, =CONFIG_SYS_PLLAR_VAL
  •        str    r0, [r1]
  •        /*Reading the PMC Status register to detect when the PLLA is locked */
  •        mov r4, #AT91_PMC_IXR_LOCKA
  • MOSCS_Loop1:
  •        ldr   r3, [r2]
  •        and  r3, r4, r3
  •        cmp r3, #AT91_PMC_IXR_LOCKA
  •        bne  MOSCS_Loop1
  • /* ----------------------------------------------------------------------------
  •  *PMC Init Step 3.
  • * - Switch on the Main Oscillator
  •  *----------------------------------------------------------------------------*/
  •        ldr   r1, =(AT91_ASM_PMC_MCKR)
  •        /*-Master Clock Controller register PMC_MCKR */
  •        ldr   r0, =CONFIG_SYS_MCKR1_VAL
  •        str    r0, [r1]
  •        /*Reading the PMC Status to detect when the Master clock is ready */
  •        mov r4, #AT91_PMC_IXR_MCKRDY
  • MCKRDY_Loop:
  •        ldr   r3, [r2]
  •        and  r3, r4, r3
  •        cmp r3, #AT91_PMC_IXR_MCKRDY
  •        bne  MCKRDY_Loop
  •  
  •        ldr   r0, =CONFIG_SYS_MCKR2_VAL
  •        str    r0, [r1]
  •        /*Reading the PMC Status to detect when the Master clock is ready */
  •        mov r4, #AT91_PMC_IXR_MCKRDY
  • MCKRDY_Loop1:
  •        ldr   r3, [r2]
  •        and  r3, r4, r3
  •        cmp r3, #AT91_PMC_IXR_MCKRDY
  •        bne  MCKRDY_Loop1
  • PLL_setup_end:
  • /* ----------------------------------------------------------------------------
  •  * -memory control configuration 2
  •  *----------------------------------------------------------------------------*/
  •        ldr   r0, =(AT91_ASM_SDRAMC_TR)  //(AT91_SDRAMC_BASE + 0x04)
  •        ldr   r1, [r0]
  •        cmp r1, #0
  •        bne  SDRAM_setup_end
  •  
  •        ldr   r0, =SMRDATA1
  •        ldr   r2, =SMRDATA2
  •        ldr   r1, _TEXT_BASE
  •        sub  r0, r0, r1
  •        sub  r2, r2, r1
  •        add  r0, r0, r5
  •        add  r2, r2, r5
  • 2:
  •        /*the address */
  •        ldr   r1, [r0], #4
  •        /*the value */
  •        ldr   r3, [r0], #4
  •        str    r3, [r1]
  •        cmp r2, r0
  •        bne  2b
  • SDRAM_setup_end:
  •        /*everything is fine now */
  •        mov pc, lr
  •        .ltorg
  • SMRDATA:
  •        .wordAT91_ASM_WDT_MR
  •        .wordCONFIG_SYS_WDTC_WDMR_VAL
  •        /*configure PIOx as EBI0 D[16-31] */
  • #if defined(CONFIG_AT91SAM9263)
  • ….
  • #elif defined(CONFIG_AT91SAM9260) ||defined(CONFIG_AT91SAM9261) \
  •        ||defined(CONFIG_AT91SAM9G20)
  •        .wordAT91_ASM_PIOC_PDR
  •        .wordCONFIG_SYS_PIOC_PDR_VAL1
  •        .wordAT91_ASM_PIOC_PUDR
  •        .wordCONFIG_SYS_PIOC_PPUDR_VAL
  • #endif
  •        .wordAT91_ASM_MATRIX_CSA0
  •        .wordCONFIG_SYS_MATRIX_EBICSA_VAL
  •        /*flash */
  •        .wordAT91_ASM_SMC_MODE0
  •        .wordCONFIG_SYS_SMC0_MODE0_VAL
  •        .wordAT91_ASM_SMC_CYCLE0
  •        .wordCONFIG_SYS_SMC0_CYCLE0_VAL
  •        .wordAT91_ASM_SMC_PULSE0
  •        .wordCONFIG_SYS_SMC0_PULSE0_VAL
  •        .wordAT91_ASM_SMC_SETUP0
  •        .wordCONFIG_SYS_SMC0_SETUP0_VAL
  • SMRDATA1:
  •        .wordAT91_ASM_SDRAMC_MR
  •        .wordCONFIG_SYS_SDRC_MR_VAL1
  •        .wordAT91_ASM_SDRAMC_TR
  •        .wordCONFIG_SYS_SDRC_TR_VAL1
  •        .wordAT91_ASM_SDRAMC_CR
  •        .wordCONFIG_SYS_SDRC_CR_VAL
  •        .wordAT91_ASM_SDRAMC_MDR
  •        .wordCONFIG_SYS_SDRC_MDR_VAL
  •        .wordAT91_ASM_SDRAMC_MR
  •        .wordCONFIG_SYS_SDRC_MR_VAL2
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL1
  •        .wordAT91_ASM_SDRAMC_MR
  •        .wordCONFIG_SYS_SDRC_MR_VAL3
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL2
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL3
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL4
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL5
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL6
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL7
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL8
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL9
  •        .wordAT91_ASM_SDRAMC_MR
  •        .wordCONFIG_SYS_SDRC_MR_VAL4
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL10
  •        .wordAT91_ASM_SDRAMC_MR
  •        .wordCONFIG_SYS_SDRC_MR_VAL5
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL11
  •        .wordAT91_ASM_SDRAMC_TR
  •        .wordCONFIG_SYS_SDRC_TR_VAL2
  •        .wordAT91_SDRAM_BASE
  •        .wordCONFIG_SYS_SDRAM_VAL12
  •        /*User reset enable*/
  •        .wordAT91_ASM_RSTC_MR
  •        .wordCONFIG_SYS_RSTC_RMR_VAL
  • #ifdefCONFIG_SYS_MATRIX_MCFG_REMAP
  •        /* MATRIX_MCFG - REMAP all masters */
  •        .word AT91_ASM_MATRIX_MCFG
  •        .word 0x1FF
  • #endif
  • SMRDATA2:
  •        .word0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
连续系统的时域分析是信号与系统学习中的重要部分。时域分析研究的是信号在时间域内的变化规律,常用的分析方法包括冲激响应法、单位阶跃响应法和相应方程法。 1. 冲激响应法 冲激响应法是一种基于系统输入信号的冲激函数的响应来分析系统时域特性的方法。具体来说,将系统输入信号表示为一个冲激序列的加权和,然后计算出系统对每个冲激的响应,得到系统的冲激响应函数。然后,通过线性时不变系统的特性,可以将任何输入信号都表示为冲激序列的加权和,从而得到系统对任何输入信号的响应。 2. 单位阶跃响应法 单位阶跃响应法是一种基于系统输入信号的单位阶跃函数的响应来分析系统时域特性的方法。具体来说,将系统输入信号表示为一个单位阶跃函数的加权和,然后计算出系统对每个单位阶跃函数的响应,得到系统的单位阶跃响应函数。然后,通过线性时不变系统的特性,可以将任何输入信号都表示为单位阶跃函数的加权和,从而得到系统对任何输入信号的响应。 3. 相应方程法 相应方程法是一种基于系统微分方程的解析解来分析系统时域特性的方法。具体来说,根据系统微分方程的特性,可以得到系统的传递函数,然后通过拉普拉斯变换将输入信号和传递函数变换到频域内,最终通过反变换得到系统的时域响应。 以上三种方法都是分析连续系统时域特性的重要方法,各自适用于不同的情况。掌握这些方法可以帮助我们更好地理解和分析连续系统的时域特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值