;软件中断<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 /><br /> BL SWI_Exception<br /> <br /> LDMFD SP!, {R0-R3, R12, PC}^<br /><br /><br /><br />任务切换是模似一次软中断,在这个程序里保存了R0-R3, R12, PC,而任务是自己写的,应该有的任务也会用到R4,R5,R6等其它寄存器。<br /><br />才入门,如果问得太基础了,请不要见笑:)<br />
|