zoukankan      html  css  js  c++  java
  • uc/os 上下文切换

    ;ARM处理器任务上下文的切换汇编语言函数OS_TSK_SW():
    ;指令说明:STMFD,是按照高地址->低地址存储,并且指针往前-4.
                
    STMFD sp!,{pc}	;		保存当前任务PC的任务栈区
    STMFD SP!,{lr}	; 		保存当前任务LR,即当前任务的返回地址,即任务栈区
    STMFD SP!,{ro-r12};     保存R0...R12到任务栈区
    MRS   R4,CPSR;			R4用作中间暂存数据寄存器
    STMFD SP!,{R4};			保存CPSR到任务栈区
    MRS   R4,SPSR;  		R4用作中间暂存数据寄存器
    STMFD SP!{R4};  		保存SPSR到任务栈区
    LDR   R4,addr_OSPrioCur;	将当前任务的优先级变量送入R4寄存器
    LDR   R5,addr_OSPrioHighRby;		将保存就绪任务最高优先级的变量送入到R5的寄存器
    LDRB  R6,[R5];						R5间接寻址,将就绪任务最高优先级的变量送入到R6寄存器
    STRB  R6,[R4];						R4简洁寻址,将就绪任务的最高优先级赋给当前任务优先级变量
    ;上述实现了INT8U整数变量的赋值:addr_OSPrioCur=addr_OSPrioHighRby;
    
    LDR   R4,addr_OSTCBCur;				将指向当前任务TCB的指针地址存入到R4寄存器
    ;此时R4的值为OSTCRCur指针的地址
    LDR   R5,[R4];						R4间接寻址,将指向当前任务的TCB指针存入到R5寄存器
    ;此时R5的值为OSTCBCur指针,即指向当前任务控制块的指针
    STR   SP,[R5];						R5间接寻址,将处理器栈区指针寄存器(R13)的值
    ;存入到当前任务TCB的起始地址(零偏移地址)
    
    LDR   R6,addr_OSTCBHighBy;          R6=就绪表中当前优先级最高任务的TCB指针的地址
    LDR   R6,[R6];						 将就绪表中最高优先级任务TCB指针存入到R6中
    LDR   SP,[R6];					 将HP任务TCB指针所指向的内存单元的值送入到Sp寄存器,
    ;也就是将最高优先级任务TCB中保存的自用栈区指针存入Sp寄存器
    
    STR   R6,[R4];						 将最高优先级任务TCB指针赋给当前任务指针变量
    ;实现了TCB指针的赋值:OSTCBCur=OSTCBHighRby
    
    ;以下指令把保存最高优先级任务自用栈区的各个寄存器弹出到CPU的各个寄存器
    LDRFD SP!,{R4};						 将栈顶的字元素弹出到R4寄存器中
    MSR   SPSR_IRQ,R4;    				 该弹出字原先保存的SPSR_IRQ,从R4寄存器中进行恢复
    LDRFD SP!,{R4};						 将栈顶的字元素弹出到R4寄存器中					  
    MSR   CPSR_IRQ,R4;    				 该弹出字原先保存的CPSR_IRQ,从R4寄存器中进行恢复
    LDRFD SP!,{R0-R12,LR,PC};      恢复R0-R12通用寄存器的值和LR和PC
    

      

    Live together,or Die alone!
  • 相关阅读:
    操作excel文件的基础工具xlrd/xlwt/xlutils学用
    第12课 OpenGL 显示列表
    第11课 OpenGL 飘动的旗帜
    第10课 OpenGL 3D世界
    第09课 OpenGL 移动图像
    第08课 OpenGL 混合
    第07课 OpenGL 光照和键盘(2)
    第07课 OpenGL 光照和键盘(1)
    第06课 OpenGL 纹理映射
    第05课 OpenGL 3D空间
  • 原文地址:https://www.cnblogs.com/hzhida/p/2395671.html
Copyright © 2011-2022 走看看