打印
[程序源码]

关于ucos任务堆栈的问题

[复制链接]
3325|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

使用特权

评论回复
5
huhaomcu|  楼主 | 2014-5-29 10:51 | 只看该作者
ayb_ice 发表于 2014-5-29 10:38
公用的寄存器
比如51
R0~R7,A,B,DPTR,PSW

如果是ARM的,是不是就是它的内核寄存器,按照内核寄存器的地址高低而依次进入堆栈

使用特权

评论回复
6
ayb_ice| | 2014-5-29 11:23 | 只看该作者
huhaomcu 发表于 2014-5-29 10:51
如果是ARM的,是不是就是它的内核寄存器,按照内核寄存器的地址高低而依次进入堆栈 ...

差不多

使用特权

评论回复
7
huhaomcu|  楼主 | 2014-5-29 19:57 | 只看该作者
ayb_ice 发表于 2014-5-29 11:23
差不多

我看它提供的几个例程,怎么觉得好像进入堆栈都是没有什么规律的,排列的方式也好像都是乱七八糟的!!

使用特权

评论回复
8
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怎么知道我是以怎样的方式入栈的呢?它有没规定排列方式,怎样去获取有用的信息咧!!!!!
求教!!!

使用特权

评论回复
9
lr2131| | 2014-5-29 22:42 | 只看该作者
这个不一定的哦,寄存器压栈顺序不是定死的,看具体的OS实现吧。
UCOS2的压栈顺序确实如楼上说的那样,不过,不是所有的OS都得这样。
我自己写的OS,压栈顺序不是这样的。

这个只要压栈前和弹栈后,都是一样的效果就行,没有死规定。

使用特权

评论回复
10
keer_zu| | 2014-5-30 07:39 | 只看该作者
@ayb_ice 请教一个问题:
1.ucos中普通函数调用编译后的代码有push和pop吗?这里都往堆栈里面压入了哪些,这里的堆栈应该是sp所指的固定长度吗?
2.ucos中任务函数在被挂起时,压入堆栈的内容和上面有和不同?这里的堆栈是从空闲任务资源中获取的吧?

使用特权

评论回复
11
通宵敲代码| | 2014-5-30 08:25 | 只看该作者
只要能保证寄存器的数据,入栈前跟出栈后不变就行了,
顺序是OS自己规定的,没有什么特殊要求的!

使用特权

评论回复
12
daxiandajie| | 2016-3-17 20:46 | 只看该作者
keer_zu 发表于 2014-5-30 07:39
@ayb_ice 请教一个问题:
1.ucos中普通函数调用编译后的代码有push和pop吗?这里都往堆栈里面压入了哪些, ...

问题1:个人理解是有的,比如一些局部变量的存储;
问题2:任务堆栈的长度由用户指定,并不是所谓的“固定值”;
问题3:任务被挂起时,压入堆栈的内容,包括当前任务的CPU寄存器的状态值,以及一些局部变量值等(现场保护),每一个用户任务都有自己的任务堆栈。

使用特权

评论回复
13
keer_zu| | 2016-3-18 08:55 | 只看该作者
daxiandajie 发表于 2016-3-17 20:46
问题1:个人理解是有的,比如一些局部变量的存储;
问题2:任务堆栈的长度由用户指定,并不是所谓的“固 ...

@ayb_ice 给点评论呗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

508

帖子

3

粉丝