嵌入式xworks系统初始化(PowerPC汇编)
?系統初始化
 系統初始化對不同的CPU,基本步驟是類似的.
 系統初始化的主要步驟以 下啟動 關閉中斷 放boot type到堆棧 清空緩存 
 VxWorks 系統的 PowerPC BSP,系統開機后執行的第一個函數 romInit(),在ROM的起點,這里是運用運用的PowerPC匯編語言
 /* 定義內部函數 internals */
 .globl romInit /* start of system code */
 .globl _romInit /* start of system code */
 
 /* 定義外部函數 externals */
 .extern romStart /* system initialization routine */
 
 .text
 .align 2
 
 /*******************************************************************************
 * 
 * romInit ( int startType /@ only used by 2nd entry point @/ )
 */
 
 romInit:
 _romInit:
 bl cold /* 冷啟動 */
 bl warm /* 熱啟動 */
 
 cold:
 li p5, BOOT_COLD? /*BOOT_COLD是否是宏定義,p5是否是SPR,li是load立即數吧?*/
 bl start /* skip over next instruction */
 
 warm:
 or p5, p0, p0 /* startType to p5 */
 
 start: /* 此處是系統啟動開始 */
 /* 屏蔽MSR中CE,EE位,關閉所有的外部中斷
 /*
 * Disable external interrupts 
 */
 
 mfmsr p0 /* p0 = msr */
 INT_MASK (p0, p1) /* mask EE and CE bit */
 ori p1,p1,_PPC_MSR_ME /* enable machine checks */
 mtmsr p1 /* msr = p1 */
 isync
 
 /* 下面兩步是按照硬件定義初始化一些SPR,DCR寄存器,置0或置1
 /* SPR是特殊功能寄存器,DCR為設備控制寄存器,還有MSR機器狀態寄存器,這些是PowerPC內核中很重要的寄存器
 /* 初始化SPR,DCR寄存器置0
 * Initalize registers that need to be set to zero.
 */
 
 addi r4,r0,0x0000
 mtspr SGR,r4 /* 解鎖所有存儲區域 SPR 中 SGR 位置0 */
 mtspr ESR, r4 /* SPR中的錯誤狀態位 ESR 清0 */
 mtspr TCR, r4 /* 關閉所有的 timers */
 mtspr PIT, r4 /* 清0 PIT timer */
 mtdcr UICER, r4 /* 關閉中斷控制器(UIC)中的所有中斷 */
 mtspr XER, r4 /* 清0 integer exception 寄存器 */
 
 /* 初始化另外一些SPR,DCR寄存器,置1
 * Initalize registers that need to be cleared with 0xFFFFFFFF.
 */
 
 addis r4,r0,0xffff
 ori r4,r4,0xffff
 mtspr TSR, r4 /* timer */
 mtspr DBSR, r4 /* 調試狀態位置1 */
 mtdcr UICSR, r4 /* 清除中斷控制器(UIC)中的所有 pending 中斷 */
 mtdcr dmasr, r4 /* DMA狀態寄存器置1 */
 
 /* PowerPC405用2個緩存,一個是16K指令緩存(ICU),一個是6K數據緩存(DCU),下面是清空著2個緩存,并根據硬件設置緩存 */
 /* 清空指令緩存 */
 /*BESR type regs ZZZZZZZZZZZZ 
 * Invalidate the entire instruction cache. This can be done
 * with a single iccci instruction in the processor core.
 */
 
 iccci r0, r0?? /*清空指令cache*/
 
 /*清空數據緩存
 * Invalidate the entire data cache.
 * The 405 processor core in the 405GP has 128 congruence classes.
 * Each cache line in the 405 processor is 32 bytes.
 */
 
 /*
 * Turn the instruction cache on for faster boot-up.
 * Also, the icache is needed to help initialize Bank 0
 * of the EBC to speed up accesses to flash.
 * address space 0x00000000-0x07ffffff is cached
 * address space 0xf8000000-0xffffffff is cached
 */
 
 lis p0, HIADJ(_PPC403_ICCR_DEFAULT_VAL)???? /*HIADJ(_PPC403_ICCR_DEFAULT_VAL)?是否是宏定義?*/
 addi p0, p0, LO(_PPC403_ICCR_DEFAULT_VAL)??? /*LO(_PPC403_ICCR_DEFAULT_VAL)?是否是宏定義?*/
 
 mtspr _PPC403_ICCR, p0
 isync
 
 /* 初始化外部總線控制器(EBC),跳轉指令BL,執行extBusCntlrInit
 * /
 
 bl extBusCntlrInit
 
 /*
 * Now that the EBC Bank 0 has been set up, turn the I-cache off if
 * i-cache was not specified in config.h. It is also invalidated
 * again.
 */
 
 #ifndef USER_I_CACHE_ENABLE
 li p0, 0 /* clear p0 */
 mtspr _PPC403_ICCR, p0 /* turn off i-cache */
 isync
 iccci r0, r0 /* invalidate the I-cache again */
 #endif
 
 /* 初始化與SDRAM有關的IIC(inter-integrated circut)寄存器IIC0,
 * Initialize IIC0 for use in automatic SDRAM configuration
 */
 
 #ifdef LOCAL_MEM_AUTOSIZE
 bl iic0Init
 #endif
 
 /* 初始化SDRAM,BL跳轉執行sdramInit
 * Configure the SDRAM controller only if this is a cold boot.
 * If the SDRAM controller is reinitialized on a warm boot, the
 * boot line will get wiped out because of the ECC SDRAM memory
 * initialization.
 */
 
 li p0, BOOT_COLD
 and. p0, p0, p5 /* p5 is saved at the entry of romInit */
 beq skip?? ?/*and與beq連用,先是用and進行位與運算,然后將位與的結果與0比較,如果為0,則跳到beq緊跟著的標記(如beq skip,則跳到skip處)。*/
 
 bl sdramInit
 
 skip:
 
 /*
 * Clear the CPU reservation bit
 */
 
 li r0, 0
 lwarx p0, r0, r0??? /*lwarx裝入指定地址的內存的內容,并且保留內存地址的內容 */
 stwcx. p0, r0, r0 /*判斷保留的地址是否和本指令的相同,如果相同則存入一個值到內存,否則什么都不干,根據是否存入內存設置條件寄存器*/
 
 #ifdef PPC405GP_REVA
 /* 設置中斷向量表到0x0000 */
 li p0, 0x2100/4??? /*作用是什么?*/
 mtctr p0
 lis p0, WALNUT_EVPR_VAL?? /*WALNUT_EVPR_VAL的值左移16位賦給p0*/
 li p1, 0x0000
 zeroOut:
 stw p1,0x0(p0)
 addi p0, p0, 4
 bdnz zeroOut
 #endif
 
 /* 初始化堆棧
 /* Initialize the stack pointer (r1) */
 
 lis sp, HIADJ(STACK_ADRS)
 addi sp, sp, LO(STACK_ADRS)
 
 #if FALSE /* SDA not supported */
 /* initialize r2 and r13 according to EABI standard */
 
 lis r2, HIADJ(_SDA2_BASE_)
 addi r2, r2, LO(_SDA2_BASE_)
 lis r13, HIADJ(_SDA_BASE_)
 addi r13, r13, LO(_SDA_BASE_)
 #endif
 
 /* 得到C代 碼romStart()在ROM中的地址,保證romInit執行結束后,系統跳轉執行romStart()
 /* calculate C entry point: routine - entry point + ROM base */
 
 lis p1, HIADJ(romStart) /* p1 = romstart */
 addi p1, p1, LO(romStart)????? /*routine地址*/
 
 lis p2, HIADJ(romInit) /* p2 = romInit */
 addi p2, p2, LO(romInit)???? /*入口地址地址*/
 
 
 /* ROM_TEXT_ADRS為ROM的入口地址,在文件makefile定義,為0xfff80100
 lis p3, HIADJ(ROM_TEXT_ADRS) /* p3 = ROM_TEXT_ADRS */ 
 addi p3, p3, LO(ROM_TEXT_ADRS)???? /*ROM base地址*/
 
 subf p1, p2, p1 /* p1 = p1 - p2 */
 add p1, p1, p3 /* p1 = p1 + p3 */
 /* p1中是romStart()的地址,這里把這個地址放到連接寄存器LR中.??
mtlr p1 /* link register = C entry point */??
 
 or p0, p5, p5 /* p0 = startType */
 addi sp, sp, -FRAMEBASESZ /* get frame stack */
 
 /* 跳轉到LR中romStart()的地址,執行romStart()
 blr /* branch to link register */ 
 
總結
以上是生活随笔為你收集整理的嵌入式xworks系统初始化(PowerPC汇编)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 谷歌 Alphabet 第四季度净利润同
 - 下一篇: PowerPC汇编指令