[程序源码] 关于ucos任务堆栈的问题

[复制链接]
3754|12
 楼主| huhaomcu 发表于 2014-5-29 09:44 | 显示全部楼层 |阅读模式
我想请问一下当任务创建时进行任务堆栈初始化如何确定进入堆栈的顺序???
ayb_ice 发表于 2014-5-29 10:00 | 显示全部楼层
依次将寄存器入栈就可以了
 楼主| huhaomcu 发表于 2014-5-29 10:17 | 显示全部楼层
ayb_ice 发表于 2014-5-29 10:00
依次将寄存器入栈就可以了

比如说那些寄存器咧!!!
ayb_ice 发表于 2014-5-29 10:38 | 显示全部楼层
公用的寄存器
比如51
R0~R7,A,B,DPTR,PSW

 楼主| huhaomcu 发表于 2014-5-29 10:51 | 显示全部楼层
ayb_ice 发表于 2014-5-29 10:38
公用的寄存器
比如51
R0~R7,A,B,DPTR,PSW

如果是ARM的,是不是就是它的内核寄存器,按照内核寄存器的地址高低而依次进入堆栈
ayb_ice 发表于 2014-5-29 11:23 | 显示全部楼层
huhaomcu 发表于 2014-5-29 10:51
如果是ARM的,是不是就是它的内核寄存器,按照内核寄存器的地址高低而依次进入堆栈 ...

差不多
 楼主| huhaomcu 发表于 2014-5-29 19:57 | 显示全部楼层
ayb_ice 发表于 2014-5-29 11:23
差不多

我看它提供的几个例程,怎么觉得好像进入堆栈都是没有什么规律的,排列的方式也好像都是乱七八糟的!!
 楼主| huhaomcu 发表于 2014-5-29 20:05 | 显示全部楼层
ayb_ice 发表于 2014-5-29 10:38
公用的寄存器
比如51
R0~R7,A,B,DPTR,PSW

OS_STK *OSTaskStkInit(void (*task)(void *pd),void *pdata,OS_STK *ptos,INT16U opt)
{
  OS_STK *stk;
  opt = opt;
  stk = ptos;
  *stk = (OS_STK)task;          // PC
  *stk = (OS_STK)task;          // LR
  *--stk = ptos;                // SP
  *--stk = 0x12121212;          // R12
  *--stk = 0x11111111;          // R11
  *--stk = 0x10101010;          // R10
  *--stk = 0x09090909;          // R9
  *--stk = 0x08080808;          // R8
  *--stk = 0x07070707;          // R7
  *--stk = 0x06060606;          // R6
  *--stk = 0x05050505;          // R5
  *--stk = 0x04040404;          // R4
  *--stk = 0x03030303;          // R3
  *--stk = 0x02020202;          // R2
  *--stk = 0x01010101;          // R1
  *--stk = 0x00000000;          // R0
  return (stk)
}

我这样写的对吗??硬件平台为CORTEX-MO+,完全不明白,这个堆栈初始化的过程,当任务运行时,UCOS怎么知道我是以怎样的方式入栈的呢?它有没规定排列方式,怎样去获取有用的信息咧!!!!!
求教!!!
lr2131 发表于 2014-5-29 22:42 | 显示全部楼层
这个不一定的哦,寄存器压栈顺序不是定死的,看具体的OS实现吧。
UCOS2的压栈顺序确实如楼上说的那样,不过,不是所有的OS都得这样。
我自己写的OS,压栈顺序不是这样的。

这个只要压栈前和弹栈后,都是一样的效果就行,没有死规定。
keer_zu 发表于 2014-5-30 07:39 | 显示全部楼层
@ayb_ice 请教一个问题:
1.ucos中普通函数调用编译后的代码有push和pop吗?这里都往堆栈里面压入了哪些,这里的堆栈应该是sp所指的固定长度吗?
2.ucos中任务函数在被挂起时,压入堆栈的内容和上面有和不同?这里的堆栈是从空闲任务资源中获取的吧?
通宵敲代码 发表于 2014-5-30 08:25 | 显示全部楼层
只要能保证寄存器的数据,入栈前跟出栈后不变就行了,
顺序是OS自己规定的,没有什么特殊要求的!
daxiandajie 发表于 2016-3-17 20:46 | 显示全部楼层
keer_zu 发表于 2014-5-30 07:39
@ayb_ice 请教一个问题:
1.ucos中普通函数调用编译后的代码有push和pop吗?这里都往堆栈里面压入了哪些, ...

问题1:个人理解是有的,比如一些局部变量的存储;
问题2:任务堆栈的长度由用户指定,并不是所谓的“固定值”;
问题3:任务被挂起时,压入堆栈的内容,包括当前任务的CPU寄存器的状态值,以及一些局部变量值等(现场保护),每一个用户任务都有自己的任务堆栈。
keer_zu 发表于 2016-3-18 08:55 | 显示全部楼层
daxiandajie 发表于 2016-3-17 20:46
问题1:个人理解是有的,比如一些局部变量的存储;
问题2:任务堆栈的长度由用户指定,并不是所谓的“固 ...

@ayb_ice 给点评论呗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

509

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部