Slim the BootLoader of ZLG:<br />Startup.s<br /><br />;/*****************************************************************************<br />;定义堆栈大小<br />;初始化系统,跳转到C程序接口<br />;*****************************************************************************/<br />SVC_STACK_LENGTH EQU 0<br />FIQ_STACK_LENGTH EQU 0<br />IRQ_STACK_LENGTH EQU 256<br />ABT_STACK_LENGTH EQU 0<br />UND_STACK_LENGTH EQU 0<br /><br />NOIRQ EQU 0x80<br />NOFIQ EQU 0x40<br />USRMD EQU 0x10<br />FIQMD EQU 0x11<br />IRQMD EQU 0x12<br />SVCMD EQU 0x13<br />ABTMD EQU 0x17<br />NDEFMD EQU 0x1b<br />OSMD EQU 0x1f<br /><br /><br />;引入要调用的全局变量或函数<br /> IMPORT __use_no_semihosting_swi<br /> IMPORT __main<br /> IMPORT TargetINI<br /> IMPORT FIQFunction<br /><br /> EXPORT __user_initial_stackheap<br /> EXPORT UsrStack<br /> EXPORT Reset<br /> EXPORT bottom_of_heap<br /><br /> CODE32<br /> AREA vectors, CODE, READONLY<br /> ENTRY<br /><br /><br />;中断向量表<br />Reset<br /> B RST_Handler<br /> B Undef_Handler<br /> B SWI_Handler<br /> B PreABT_Handler<br /> B DABT_Handler<br /> DCD 0xb9295f80<br /> LDR PC, [PC,#-0xff0] ;PC=0x20,PC-0xff0=0xfffff030<br /> B FIQ_Handler ;既是IRQ中断的寄存器地址,加载PC<br /> <br /> <br /> <br />;RSTadr DCD RST_Handler<br />;Undefadr DCD Undef_Handler<br />;SWIadr DCD SWI_Handler<br />;PreABTadr DCD PreABT_Handler<br />;DABTadr DCD DABT_Handler<br />;FIQadr DCD FIQ_Handler<br /> <br /> <br />RST_Handler<br /> <br /> BL StackINI ;初始化系统堆栈分配<br /> BL TargetINI ;跳转C语言目标板初始化函数<br /> B __main ;跳转到C语言main函数<br /> <br />Undef_Handler<br /> B Undef_Handler <br /> <br /> <br />SWI_Handler<br /> CMP R0, #4 ;判断软件中断的类型号,实现跳转<br /> LDRLO PC, [PC, R0, LSL#2]<br /> MOVS PC, LR<br /> <br /> <br />SWIFunction<br /> DCD IRQDisable ;软件中断跳转向量表<br /> DCD IRQEnable<br /> DCD FIQDisable <br /> DCD FIQEnable<br /> <br /> <br />IRQDisable <br /> MRS R0, SPSR <br /> ORR R0, R0, #NOIRQ<br /> MSR SPSR_c, R0 <br /> MOVS PC, LR<br /> <br />IRQEnable <br /> MRS R0, SPSR <br /> BIC R0, R0, #NOIRQ<br /> MSR SPSR_c, R0<br /> MOVS PC, LR<br /> <br />FIQDisable<br /> MRS R0, SPSR<br /> ORR R0, R0, #NOFIQ<br /> MSR SPSR_c, R0<br /> MOVS PC, LR<br /> <br />FIQEnable<br /> MRS R0, SPSR<br /> BIC R0, R0, #NOFIQ<br /> MSR SPSR_c, R0<br /> MOVS PC, LR<br /> <br /> <br />PreABT_Handler<br /> B PreABT_Handler<br /> <br />DABT_Handler<br /> B DABT_Handler<br /> <br />;快速中断跳转处理 <br />FIQ_Handler<br /> STMFD SP!, {R0-R3,LR}<br /> BL FIQFunction<br /> LDMFD SP!, {R0-R3,LR}<br /> SUBS PC, LR, #4 <br /> <br /> <br />StackINI<br /> ;设置快速中断堆栈<br />;芯片复位后是管理模式,管理模式可以进行处理器模式切换<br />;但不适合运行程序,必须在用户/系统模式下运行程序,<br />;保存堆栈初始化子程序,因为此时的LR是管理模式下的LR<br /> <br /> MOV R0, LR <br /> <br /> MSR CPSR_c, #0xd1 <br /> LDR SP, Stack_fiq<br /> ;设置IRQ中断堆栈<br /> MSR CPSR_c, #0xd2 <br /> LDR SP, Stack_irq<br /> MSR CPSR_c, #0xd3 <br /> LDR SP, Stack_svc<br /> MSR CPSR_c, #0xd7 <br /> LDR SP, Stack_abt<br /> MSR CPSR_c, #0xdb <br /> LDR SP, Stack_und<br /> MSR CPSR_c, #0xdf<br /> LDR SP, =UsrStack<br /> <br /> ;返回<br /> MOV PC, R0 ;加载返回地址 <br /><br />;设置堆栈起始地址和长度<br />;R0--HEAP BASE R1--STACK BASE<br />;R2--HEAP LENGTH R3--STACK LENGTH <br />__user_initial_stackheap<br /> LDR R0, =bottom_of_heap<br /> MOV PC, LR <br /> <br /> <br /> <br /><br />;定义堆栈空间大小<br />Stack_svc DCD SvcSpace + (SVC_STACK_LENGTH-1)*4<br />Stack_fiq DCD FiqSpace + (FIQ_STACK_LENGTH-1)*4 <br />Stack_irq DCD IrqSpace + (IRQ_STACK_LENGTH-1)*4 <br />Stack_abt DCD AbtSpace + (ABT_STACK_LENGTH-1)*4 <br />Stack_und DCD UndSpace + (UND_STACK_LENGTH-1)*4 <br /> <br /> <br /> <br /> AREA mystack, DATA, NOINIT, ALIGN=2 ;分配堆栈空间<br /> <br />SvcSpace SPACE SVC_STACK_LENGTH*4<br />FiqSpace SPACE FIQ_STACK_LENGTH*4<br />IrqSpace SPACE IRQ_STACK_LENGTH*4<br />AbtSpace SPACE ABT_STACK_LENGTH*4<br />UndSpace SPACE UND_STACK_LENGTH*4<br /> <br /><br />;定义堆的RAM空间<br /> AREA HEAP, DATA, NOINIT<br />bottom_of_heap SPACE 1<br /><br /> <br />;定义栈的RAM空间 <br /> AREA STACKS, DATA, NOINIT<br />UsrStack<br /><br /> END <br /> <br /> <br /> <br /> <br /> <br /> |
|