uc/OSII 任务切换

代码
 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 }

如上图,在执行完第35句后,SP=0x1C3,则对应内容为,

H:0x00

CCR:0x60

A:0x00

X:0x00

PC:0x1A4D (Big Endian)

即,MCU跳到0x1A4D 代码开始执行,从而实现了任务切换!

原文地址:https://www.cnblogs.com/yuxi/p/1867665.html