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