?? head.s
字號:
#include <s3c2410.h>
#define PID_OFT 0
#define STATE_OFT 4
#define COUNT_OFT 8
#define TIMER_OFT 12
#define PRIORITY_OFT 16
#define CONTENT_OFT 20
#define KERNELSTACK_OFT 100
#define SIZEOF_TASK_STRUCT 100+1024*4
.extern task
.extern main
.text
.global _start
_start:
@******************************************************************************
@中斷向量,除Reset和HandleIRQ外,其它異常都沒有使用(如果不幸發生了,將導致死機)
@******************************************************************************
b Reset
@ 0x04: Undefined instruction exception
HandleUndef:
b HandleUndef
@ 0x08: Software interrupt exception
ldr pc, HandleSWIAddr
@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)
HandlePrefetchAbort:
b HandlePrefetchAbort
@ 0x10: Data Access Memory Abort
HandleDataAbort:
b HandleDataAbort
@ 0x14: Not used
HandleNotUsed:
b HandleNotUsed
@ 0x18: IRQ(Interrupt Request) exception
ldr pc, HandleIRQAddr
@ 0x1c: FIQ(Fast Interrupt Request) exception
HandleFIQ:
b HandleFIQ
HandleSWIAddr:
.long HandleSWI
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 clock_init @啟動PLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
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, =(SDRAM_BASE+0x100000) @重新設置堆棧(因為下面就要跳到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, #0xd3 @進svc入模式
ldr sp, =task @設置svc模式堆棧
ldr r0, =SIZEOF_TASK_STRUCT
add sp, sp, r0
msr cpsr_c, #0xd2 @進入中斷模式
ldr sp, =(SDRAM_BASE+0x100000) @設置中斷模式堆棧(0x34000000)
msr cpsr_c, #0xdf @進入系統模式
ldr sp, =(SDRAM_BASE+0x100000-1024) @設置系統模式堆棧
bl Timer0_init @調用Timer0初始化函數,在init.c中
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_loop
HandleIRQ:
sub lr, lr, #4 @ 計算返回地址
ldr sp, =(SDRAM_BASE+0x100000) @ 每次進入中斷時,中斷模式的sp都一樣
stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器
ldr lr, =int_return @ 設置返回地址
ldr pc, =IRQ_Handle @ 調用中斷處理函數,在interrupt.c中
int_return:
ldmia sp!, { r0-r12,pc }^ @ 中斷返回, ^表示將spsr的值復制到cpsr
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -