|
楼主 |
发表于 2010-4-19 09:33:01
|
显示全部楼层
所有中断服务程序都是一样的结构,下面以串口中断服务程序为例。
rt_hw_uart0_receive_handler:
PUSHM R0,R1,R2,R3,A0,A1,SB,FB ; 保存现场
JSR rt_interrupt_enter ; 调用RTT函数,通知进入中断
JSR u0rec_handler ; 执行串口中断处理
JSR rt_interrupt_leave ; 调用RTT函数,通知退出中断
CMP.W #1, rt_thread_switch_interrput_flag ; 如果中断切换上下文标志==1,则跳转到rt_hw_context_switch_interrupt_do
JEQ rt_hw_context_switch_interrupt_do ; 执行中断上下文切换
; 如果中断切换上下文标志!=1
POPM R0,R1,R2,R3,A0,A1,SB,FB ; 恢复现场
REIT ; 串口中断服务程序正常退出
rt_hw_context_switch_interrupt_do
MOV.W #0, rt_thread_switch_interrput_flag ;清除中断切换上下文标志
MOV.W rt_interrupt_from_thread, A0 ;保存堆栈指针到from_thread
STC ISP, [A0]
MOV.W rt_interrupt_to_thread, A0 ;将to_thread设置为新的堆栈指针
LDC [A0], ISP
POPM R0,R1,R2,R3,A0,A1,SB,FB ;利用to_thread堆栈恢复中断现场
REIT ;中断返回,切换到新任务to_thread |
|