博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uc/os 上下文切换
阅读量:4502 次
发布时间:2019-06-08

本文共 1397 字,大约阅读时间需要 4 分钟。

;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

  

转载于:https://www.cnblogs.com/hzhida/archive/2012/03/14/2395671.html

你可能感兴趣的文章
MATLAB——scatter的简单应用
查看>>
linux下复制粘贴快捷键
查看>>
什么是对象
查看>>
记录开发小程序
查看>>
WinSock服务程序
查看>>
巴西柔术第五课:过腿
查看>>
文件的操作
查看>>
网上图书商城项目学习笔记-007登录功能实现
查看>>
关于mysql的级联删除(之前好多人咨询过我)
查看>>
Linux环境下的C/C+基础调试技术2——程序控制
查看>>
wpf动画同步闪烁
查看>>
3.16上午 复习雅思核心词+新单词100个
查看>>
Html5 部分特性
查看>>
前端工具集合记录
查看>>
浅析负载均衡的6种算法,Ngnix的5种算法
查看>>
OpenCV——图像修补
查看>>
自定义 DateTime 格式字符串
查看>>
设计模式--工厂模式Factory
查看>>
五年修炼SEO、一年五万,多嘛?(看时间如何管理?五点论……)
查看>>
Mesos源码分析(16): mesos-docker-executor的运行
查看>>