|
;;这是启动文件的部分<br />IMPORT SWI_Exception<br />;定义堆栈的大小<br />SVC_STACK_LEGTH EQU 128<br />FIQ_STACK_LEGTH EQU 128<br />IRQ_STACK_LEGTH EQU 128<br />ABT_STACK_LEGTH EQU 0<br />UND_STACK_LEGTH EQU 0<br /><br />NoInt EQU 0x80<br />T_bit EQU 0x20<br /><br />__user_initial_stackheap <br /> LDR r0,=bottom_of_heap<br />; LDR r1,=StackUsr<br /> LDR r2,=top_of_heap<br /> LDR r3,=bottom_of_Stacks<br /> MOV pc,lr<br /><br /><br />StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4<br />StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4<br />StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4<br />StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4<br />StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4<br /><br />AREA MyStacks, DATA, NOINIT, ALIGN=2<br />SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;<br />IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 <br />FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 <br />AbtStackSpace SPACE ABT_STACK_LEGTH * 4 <br />UndtStackSpace SPACE UND_STACK_LEGTH * 4 <br /><br />;软中断 直接在启动文件中加入<br />SoftwareInterrupt<br /> LDR SP, StackSvc ; 重新设置堆栈指针<br /> STMFD SP!, {R0-R3, R12, LR}<br /> MOV R1, SP ; R1指向参数存储位置<br /><br /> MRS R3, SPSR<br /> TST R3, #T_bit ; 中断前是否是Thumb状态<br /> LDRNEH R0, [LR,#-2] ; 是: 取得Thumb状态SWI号<br /> BICNE R0, R0, #0xff00<br /> LDREQ R0, [LR,#-4] ; 否: 取得arm状态SWI号<br /> BICEQ R0, R0, #0xFF000000<br /> ; r0 = SWI号,R1指向参数存储位置<br /> ;CMP R0, #1 ;;;这三句我删除了,看得不大明白<br /> ;LDRLO PC, =OSIntCtxSw<br /> ;LDREQ PC, =__OSStartHighRdy ; SWI 0x01为第一次任务切换<br /> BL SWI_Exception <br /> LDMFD SP!, {R0-R3, R12, PC}^<br /><br />/***********这段在C文件中写***********************/<br />#define c_NoallInt 0xc0<br />#define c_NoInt 0x80<br />#define c_dis_fiqirq 0<br />#define c_en_fiqirq 1<br />#define c_dis_irq 2<br />#define c_en_irq 3<br />__swi(c_dis_fiqirq) void swi_dis_fiqirq(void); <br />__swi(c_en_fiqirq) void swi_en_fiqirq(void); <br />__swi(c_dis_irq) void swi_dis_irq(void); <br />__swi(c_en_irq) void swi_en_irq(void); <br /><br />void SWI_Exception(int SWI_Num)<br />{<br /> <br /> switch(SWI_Num)<br /> {<br /> case 0x00:<br /> __asm<br /> {<br /> MRS R0, SPSR<br /> ORR R0, R0, #c_NoallInt<br /> MSR SPSR_c, R0<br /> }<br /> break; <br /> case 0x01:<br /> __asm<br /> {<br /> MRS R0, SPSR<br /> BIC R0, R0, #c_NoallInt<br /> MSR SPSR_c, R0<br /> }<br /> break; <br /> case 0x02: <br /> __asm<br /> {<br /> MRS R0, SPSR<br /> ORR R0, R0, #c_NoInt<br /> MSR SPSR_c, R0<br /> }<br /> break;<br /> case 0x03: <br /> __asm<br /> {<br /> MRS R0, SPSR<br /> BIC R0, R0, #c_NoInt<br /> MSR SPSR_c, R0<br /> }<br /> break;<br /> default:<br /> break;<br /> }<br />}<br /><br />#define wdt() <br />{swi_dis_fiqirq();WDFEED=0xaa;WDFEED=0x55;swi_en_fiqirq();} //喂狗<br /> |
|