?? head.s
字號:
@******************************************************************************
@ File:head.s
@ 功能:設置SDRAM,將程序復制到SDRAM,然后跳到SDRAM繼續執行
@******************************************************************************
.extern main.text .global _start _start:@****************************************************************************** @中斷向量,除Reset和HandleIRQ外,其它異常都沒有使用(如果不幸發生了,將導致死機)@****************************************************************************** b Reset@ 0x04: Undefined instruction exceptionHandleUndef: b HandleUndef @ 0x08: Software interrupt exception HandleSWI: b HandleSWI@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)HandlePrefetchAbort: b HandlePrefetchAbort@ 0x10: Data Access Memory AbortHandleDataAbort: b HandleDataAbort@ 0x14: Not usedHandleNotUsed: b HandleNotUsed@ 0x18: IRQ(Interrupt Request) exception ldr pc,HandleIRQAddr@ 0x1c: FIQ(Fast Interrupt Request) exceptionHandleFIQ: b HandleFIQ HandleIRQAddr: .long HandleIRQ Reset: @函數disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定義 ldr sp, =4096 @設置堆棧 bl disable_watch_dog @關WATCH DOG bl memsetup_2 @初始化SDRAM bl init_nand @初始化NAND Flash bl copy_vectors_from_nand_to_sdram bl copy_process_from_nand_to_sdram ldr sp, =0x30100000 @重新設置堆棧(因為下面就要跳到SDRAM中執行了) ldr pc, =run_on_sdram @跳到SDRAM中run_on_sdram: bl mmu_tlb_init @調用C函數mmu_tlb_init(mmu.c中),建立頁表 bl mmu_init @調用C函數mmu_init(mmu.c中),使能MMU msr cpsr_c, #0xd2 @進入中斷模式 ldr sp, =0x33000000 @設置中斷模式堆棧 msr cpsr_c, #0xdf @進入系統模式 ldr sp, =0x30100000 @設置系統模式堆棧 bl init_irq @調用中斷初始化函數,在init.c中 msr cpsr_c, #0x5f @設置I-bit=0,開IRQ中斷 ldr lr, =halt_loop @設置返回地址 ldr pc, =main @b指令和bl指令只能前后跳轉32M的范圍,所以這里使用向pc賦值的方法進行跳轉halt_loop: b halt_loopHandleIRQ: sub lr, lr, #4 @計算返回地址 stmdb sp!, { r0-r12,lr } @保存使用到的寄存器 ldr lr, =int_return @設置返回地址
ldr pc, =EINT_Handle @調用中斷處理函數,在interrupt.c中int_return: ldmia sp!, { r0-r12,pc }^ @中斷返回, ^表示將spsr的值復制到cpsr
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -