⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 head.s

📁 一个基于MMU的操作系统
💻 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 + -