代码
1 interrupt 1 void OSCtxSw(void) //swi软中断
2 {
3 //PSHH //编译器自动加上
4
5 //将当前栈指针压栈//压栈的顺序: PCL, PCH, X, A,CCR and H
6
7 //将当前的栈指针存到当前任务栈指针处
8 asm
9 {
10 TSX //H:X ← (SP) + $0001//Transfer SP to Index Reg.
11 PSHX
12 PSHH
13
14 LDHX OSTCBCur //指向当前任务的TCB
15
16 //将指向H的栈指针保存到TCB,这样,回到原来任务时就知道从哪里恢复现场,从哪里继续执行代码.
17 PULA
18 STA 0,X //保存堆栈指针到TCB
19 PULA
20 STA 1,X
21 }
22
23 //此段汇编主要是将最高优先级的任务块栈指针赋值给SP
24 asm
25 {
26 LDA OSPrioHighRdy //OSPrioCur = OSPrioHighRdy
27 STA OSPrioCur
28
29 LDHX OSTCBHighRdy
30 STHX OSTCBCur
31 LDHX 0,X //将X指向的内容存到HX,即将任务块栈指针存到HX
32
33 TXS //SP ← (H:X) – $0001
34 ;;;;;;;;;;;;;;;;;
35 PULH //SP加1 ,这时,SP等于OS_STK *OSTCBStkPtr;
36 RTI //从SP出开始出栈,顺序为:H,CCR,A,X,PCH,PCL,至此,PC恢复到任务上次退出的位置
37 }
38 }
2 {
3 //PSHH //编译器自动加上
4
5 //将当前栈指针压栈//压栈的顺序: PCL, PCH, X, A,CCR and H
6
7 //将当前的栈指针存到当前任务栈指针处
8 asm
9 {
10 TSX //H:X ← (SP) + $0001//Transfer SP to Index Reg.
11 PSHX
12 PSHH
13
14 LDHX OSTCBCur //指向当前任务的TCB
15
16 //将指向H的栈指针保存到TCB,这样,回到原来任务时就知道从哪里恢复现场,从哪里继续执行代码.
17 PULA
18 STA 0,X //保存堆栈指针到TCB
19 PULA
20 STA 1,X
21 }
22
23 //此段汇编主要是将最高优先级的任务块栈指针赋值给SP
24 asm
25 {
26 LDA OSPrioHighRdy //OSPrioCur = OSPrioHighRdy
27 STA OSPrioCur
28
29 LDHX OSTCBHighRdy
30 STHX OSTCBCur
31 LDHX 0,X //将X指向的内容存到HX,即将任务块栈指针存到HX
32
33 TXS //SP ← (H:X) – $0001
34 ;;;;;;;;;;;;;;;;;
35 PULH //SP加1 ,这时,SP等于OS_STK *OSTCBStkPtr;
36 RTI //从SP出开始出栈,顺序为:H,CCR,A,X,PCH,PCL,至此,PC恢复到任务上次退出的位置
37 }
38 }
如上图,在执行完第35句后,SP=0x1C3,则对应内容为,
H:0x00
CCR:0x60
A:0x00
X:0x00
PC:0x1A4D (Big Endian)
即,MCU跳到0x1A4D 代码开始执行,从而实现了任务切换!