2 sayato sayato 于 2017.01.16 22:35 提问

ucos系统堆栈与任务堆栈是怎么建立联系的

我的Q405234961
关于UCOS中cpu当前运行的各寄存器R0....的值,在切换任务或者中断的时候,是如何被保存到对应的任务堆栈中的,又是如何将 即将运行的任务堆栈的内容拷贝到CPU运行的寄存器中?
我看了ucos上相关的两段汇编,完全看不懂,不知道前辈能否指教一下,不胜感激。
; OS_CTX_SAVE
;
; Description : This MACRO saves the CPU registers (i.e. CPU context) onto the current task's stack using
; the same order as they were saved in OSTaskStkInit().
;********************************************************************************************************

OS_CTX_SAVE .macro
; Save remaining registers.
PUSH AR1H:AR0H ; AR1H:AR0H
PUSH XAR2 ; XAR2
PUSH XAR3 ; XAR3
PUSH XAR4 ; XAR4
PUSH XAR5 ; XAR5
PUSH XAR6 ; XAR6
PUSH XAR7 ; XAR7
PUSH XT ; XT
PUSH RPC ; RPC

.endm

OS_STK *OSTaskStkInit (void (*task)(void *p_arg),
void *p_arg,
OS_STK *ptos,
INT16U opt)

假设:有任务A,B,对应的任务堆栈是A_Stack[512],B_Stack[512],
当前运行任务A,如果此时发生任务切换(切换到B),cpu是如何保存当前各寄存器的值到A的任务堆栈中的,
当保存好A的任务堆栈后,又是如何将B的任务堆栈推向CPU各寄存器中运行的

1个回答

caozhy
caozhy   Ds   Rxr 2017.01.16 23:37
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
UCOS局部变量、任务堆栈
UCOS中局部变量的生命周期: 任务一直存在,所以在任务中(非子函数)定义的局部变量不会死亡,在任务间的信息传递因局部变量未死亡而可行。在子函数中定义的局部变量在退出该函数时才死亡,在子函数中调用任务切换时局部变量保留,在任务切换所至任务执行完成并回到子函数正常退出时才死亡。 UCOS任务堆栈: 【函数嵌套、所调用函数局部变量分配内存、中断服务子程序嵌套】 1、当任务运行时保存一些局部变量(CP
uCOS任务堆栈的深入分析
uCOS任务堆栈的深入分析简要分析了uCOS任务堆栈
ucos II 系统学习之------任务堆栈检测
不少屌丝同学都有类似经历吧,在使用ucosii创建任务时,关于任务堆栈大小设为多大合适搞的不清不楚,郁闷之下就随便整个数,比如就1024吧,呵呵,反正也没见得出问题,那就不多想了。 我想大多数同学都是这样做的吧。这样只是因为在一般情况下,1024确实已经足够大了,堆栈溢出的可能性很小而已。那么,如果你任务实际使用率只有很小的百分之几,一旦被你知道了,你会痛心不?我想你不痛心,μ
UCOS III 任务堆栈理解
 UCOS III在创建任务时,调用OSTaskStkInit函数,以初始化正在创建的任务的堆栈框架。1;堆栈就是一段连续的空间。用于存储数据的,在c计算机中有很多应用,比如发生中断时保存现场,c语言函数调用时保存现场和临时变量。2;堆栈指针就是一个数据指针。有时候计算机自己更改其指针指向的位置来保存数据,如中断时,有时候我们程序员更改其值,比如ucos操作系统做任务切换时。堆栈作用的就是用来保存...
ucos II 系统学习之------堆栈理解
第一,当任务运行时,它用来保存一些局部变量; 第二,当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。 uCOS任务堆栈的深入分析(转) 堆栈作用的就是用来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中。在uCOS中,每一个任务都有一个独立的任务堆栈。为了深入理解任务堆栈的作用,不妨分析任务从“出生”到“消亡”的整个过程,具体就是分析任务的建立,运行,挂
浅谈STM32堆栈与uCOS堆栈,其实是两码事!~
本博文分为3部分,分别为启动代码篇,C堆栈篇,和STM32堆栈和uCOS堆栈区别篇.***********************************************①启动代码篇***********************************************前年毕业时,去了意法半导体工作,所以结识了STM32,先后学习了STM32和uCOS,在后边的学习中突然有了一个疑惑...
uCOS运行时堆栈管理
//对于uCOS来讲,并没有堆栈管理的操作。 /*-------------------------------------------------------------------------------------------------------------------------*/ 堆管理 而这里的内存管理,实质是预先分配固定大小的内存, 使用时只能使用相
ucos 任务堆栈
详细介绍了ucosii的任务堆栈,对初学者有很大的帮助。
uCOS任务堆栈的理解
堆栈作用的就是用来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中。在uCOS中,每一个任务都有一个独立的任务堆栈。为了深入理解任务堆栈的作用,不妨分析任务从“出生”到“消亡”的整个过程,具体就是分析任务的建立,运行,挂起几种状态中任务堆栈的变化情况。   现在假设系统运行着一个由用户创建的用以完成打印工作的任务TPrint。TPrint最初通过OSTaskCreate()函数
怎样判断ucos ii ostaskcreate任务的 堆栈是否溢出
1.1. 任务堆栈一但溢出,意味着系统的崩溃,在有MMU或者MPU的系统中,对堆栈溢出的检测十分简单,因为这是MMU和MPU必备的功能之一。(uCOS-II/uCOS-III中均有针对没有MMU和MPU的处理器对堆栈溢出检测的策略) 1.2. 堆栈的大小取决于该任务的需求。设定堆栈大小时,你就需要考虑:所有可能被堆栈调用的函数及其函数的嵌套层数,相关局部变量的大小,中断服务程序所需要的空间。另外