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 代码开始执行,从而实现了任务切换!

  • 相关阅读:
    [前端插件]Bootstrap Table服务器分页与在线编辑应用总结
    Accord.NET_Naive Bayes Classifier
    Accord.NET入门
    [C++]STL容器Vector的内存释放
    [设计模式]适配器模式与外观模式
    [设计模式]工厂模式
    Linux下spi驱动开发
    Qt移植对USB鼠标键盘、触摸屏的支持
    linux设备模型详解 http://blog.csdn.net/linux_xiaomugua/article/details/6989386
    LGPL协议的理解
  • 原文地址:https://www.cnblogs.com/yuxi/p/1867665.html
Copyright © 2011-2022 走看看