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!
  • 相关阅读:
    由12306.cn谈谈网站性能技术 岁月无情
    雅虎网站页面性能优化的34条黄金守则 岁月无情
    [纯技术讨论]从12306谈海量事务高速处理系统 岁月无情
    解密淘宝网的开源架构(转) 岁月无情
    HttpCombiner.ashx处理 岁月无情
    转 自定义控件属性的特性大全 岁月无情
    模式窗口window.showModal 岁月无情
    动态加载JSashx的妙用 岁月无情
    ASP.NET中Get和Post的用法 岁月无情
    初学Oracle的笔记(1)——基础内容(实时更新中..)
  • 原文地址:https://www.cnblogs.com/hzhida/p/2395671.html
Copyright © 2011-2022 走看看