zoukankan      html  css  js  c++  java
  • 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 代码开始执行,从而实现了任务切换!

  • 相关阅读:
    docker安装kibana
    docker 安装elasticsearch
    redis常用命令
    判断CheckBox,select是否被选中
    里面的div怎么撑开外面的div,让高度自适应
    超链接,表单jquery提交方式
    SSM框架的sql中参数注入(#和$的区别)
    springmvc接收值的方式
    mysql语法顺序
    js创建对象并赋值其属性
  • 原文地址:https://www.cnblogs.com/yuxi/p/1867665.html
Copyright © 2011-2022 走看看