OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8731|回复: 19

关于任务创建时的堆栈栈顶方向的问题。

[复制链接]
头像被屏蔽

38

主题

104

帖子

0

精华

禁止发言

积分
291
金钱
291
注册时间
2014-3-20
在线时间
2 小时
发表于 2014-12-14 19:26:07 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-12-14 19:26:08 | 显示全部楼层
向上增长就是地址从小到大,那么栈顶就是一个数组的TaskStk[0]了。向下增长就是地址从大到小,那么栈顶就是TaskStk[SIZE-1]
开往春天的手扶拖拉机
回复

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-12-14 19:26:08 | 显示全部楼层
回复【6楼】zhumingxu317:
---------------------------------
我来说下我的理解吧,向上增长就是从低地址向高地址增长,数组元素的地址是递增的这个是肯定的,假设这个堆栈区的内存地址是从0~99,对应的数组的地址就是&Table[0]~&Table[99],其中&Table[0] = 地址0,&Table[1] = 地址1,以此类推,&Table[99] = 地址99,上面上说了堆栈的增长方式是向上增长,那么第一个压入栈的数据肯定存在&Table[0]这个里面,此时栈顶和栈底重合,随着你压入数据越来越多,直到压满整个堆栈区为止,压满数据后栈顶指针为&Table[99],也就是说栈顶和栈底相距“最远”,我猜你肯定看的是任哲的书,他说OSTaskCreate();这个函数的第三个参数是栈顶指针,其实他这句话说得容易引起误解,他应该在栈顶指针前面加个形容词“空栈时候的”,因为这个函数的第三个参数是空栈时候的栈顶指针,此时的栈顶指针和栈底指针是重合的,如果堆栈是向上增长,那么空栈时候的栈顶指针肯定指向&Table[0]呀;如果堆栈是向下增长,那么空栈时候的栈顶指针肯定指向&Table[99]呀,从指针&Table[99]开始压入数据,压一个数据之后地址减1,指向&Table[98],以此类推...    
希望上面一大串叙述能解开你的疑惑
合肥-文盲
回复

使用道具 举报

头像被屏蔽

38

主题

104

帖子

0

精华

禁止发言

积分
291
金钱
291
注册时间
2014-3-20
在线时间
2 小时
 楼主| 发表于 2014-12-14 19:33:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12691
金钱
12691
注册时间
2012-11-26
在线时间
3710 小时
发表于 2014-12-14 19:37:01 | 显示全部楼层
回复【3楼】zhumingxu317:
---------------------------------
就像排队  从前数   从后数的区别
学无止境
回复

使用道具 举报

头像被屏蔽

38

主题

104

帖子

0

精华

禁止发言

积分
291
金钱
291
注册时间
2014-3-20
在线时间
2 小时
 楼主| 发表于 2014-12-14 19:41:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

38

主题

104

帖子

0

精华

禁止发言

积分
291
金钱
291
注册时间
2014-3-20
在线时间
2 小时
 楼主| 发表于 2014-12-14 19:45:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-12-17 10:26:47 | 显示全部楼层
回复【6楼】zhumingxu317:
---------------------------------
这里我假设的堆栈区的数组是Tabe[100],即从Tabe[0]~Tabe[99]  共计100个元素,每个元素对应一个地址,希望你能明白
合肥-文盲
回复

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-12-17 10:30:44 | 显示全部楼层
回复【3楼】zhumingxu317:
---------------------------------
看来你是不理解什么是堆栈,我来说说我对“栈”的理解吧。
堆栈严格来说应该叫做栈,栈(Stack)是限定仅在一端进行插入或删除操作的线性表。因此,对栈来说,可以进行插入或删除操作的一端端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含元素的空表称为空栈。由于堆栈只允许在一端进行操作,因而按照后进先出(LIFO-Last In First Out)的原理运作。
    从栈顶的定义来看,栈顶的位置是可变的。空栈时,栈顶和栈底重合;满栈时,栈顶离栈底最远。ARM的堆栈和uC/OS操作系统的任务堆栈又有区别,uC/OS的每个任务都有自己的堆栈,要是把uC/OS移植到ARM上,可以借助ARM的堆栈指针来实现。存储器堆栈可分为两种:
                    向上生长:从低地址向高地址方向生长,称为递增堆栈
                    向下生长:从高地址向低地址方向生长,称为递减堆栈
      堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要放入的空位置,称为空堆栈。这样就有4中类型的堆栈表示递增和递减的满堆栈和空堆栈的各种组合。
合肥-文盲
回复

使用道具 举报

头像被屏蔽

38

主题

104

帖子

0

精华

禁止发言

积分
291
金钱
291
注册时间
2014-3-20
在线时间
2 小时
 楼主| 发表于 2014-12-17 14:42:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-12-17 14:44:51 | 显示全部楼层
回复【10楼】zhumingxu317:
---------------------------------
我有同学也是淮北的
合肥-文盲
回复

使用道具 举报

头像被屏蔽

38

主题

104

帖子

0

精华

禁止发言

积分
291
金钱
291
注册时间
2014-3-20
在线时间
2 小时
 楼主| 发表于 2014-12-17 14:45:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-12-17 16:09:45 | 显示全部楼层
回复【12楼】zhumingxu317:
---------------------------------
大大大的。。。    哈哈
合肥-文盲
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-6-3
在线时间
8 小时
发表于 2015-11-25 11:17:36 | 显示全部楼层
回复【7楼】合肥-文盲:
---------------------------------
感谢分享,解决了我的疑问!
回复

使用道具 举报

20

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-28
在线时间
108 小时
发表于 2016-12-8 15:51:30 | 显示全部楼层
合肥-文盲 发表于 2014-12-14 19:26
回复【6楼】zhumingxu317:
---------------------------------
我来说下我的理解吧,向上增长就是从低 ...

牛逼,就是看任哲的书迷惑了。
你这动态头像怎么盗走?
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-10-10
在线时间
11 小时
发表于 2017-6-17 08:45:58 | 显示全部楼层
合肥-文盲 发表于 2014-12-14 19:26
回复【6楼】zhumingxu317:
---------------------------------
我来说下我的理解吧,向上增长就是从低 ...

分析的很透彻,我有个问题,在正点原子的第7讲 UCOSIII任务管理(中)中有如下内容:
函数OSTaskCreate()中的参数p_stk_base是任务堆栈基地址,那么如果CPU的堆栈是向上增长的话那么基地址就&START_TASK_STK[0],如果CPU堆栈是向下增长的话基地址就是&START_TASK_STK[START_STK_SIZE-1]STM32的堆栈是向下增长的!  


问题在于,既然STM32的堆栈是向下增长的,那么堆栈的基地址就应该是&START_TASK_STK[START_STK_SIZE-1],为什么正点原子所有例程中的堆栈基地址都是&START_TASK_STK[0]呢?
回复

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2017-7-18 15:58:36 | 显示全部楼层
yunitongxing120 发表于 2017-6-17 08:45
分析的很透彻,我有个问题,在正点原子的第7讲 UCOSIII任务管理(中)中有如下内容:
函数OSTaskCreate() ...

我和你一样的困惑啊,Cortex-M3/M4的堆栈方向都是向下的,可UCOSii/iii里p_stk_base的配置都是&START_TASK_STK[0],这个好奇怪呀。。。
@Pony279

现在您清楚了么?求交流~  @正点原子
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-7-18 20:48:58 | 显示全部楼层
yunitongxing120 发表于 2017-6-17 08:45
分析的很透彻,我有个问题,在正点原子的第7讲 UCOSIII任务管理(中)中有如下内容:
函数OSTaskCreate() ...

这是UCOSII和UCOSIII的差异。
UCOSII是不会自动计算栈顶的,需要你指定。
但是UCOSIII是有一个堆栈大小的参数,你进入函数,就可以看到UCOSIII会自动设置栈顶地址,根据你的堆栈大小来设置。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-7-18 20:53:33 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2017-7-19 09:23:54 | 显示全部楼层
正点原子 发表于 2017-7-18 20:53
http://www.openedv.com/forum.php?mod=viewthread&tid=104028&page=1#pid581029

那原子哥你在ppt写的那个  

函数OSTaskCreate()中的参数p_stk_base是任务堆栈基地址,那么如果CPU的堆栈是向上增长的话那么基地址就&START_TASK_STK[0],如果CPU堆栈是向下增长的话基地址就是&START_TASK_STK[START_STK_SIZE-1]STM32的堆栈是向下增长的!  


这个是不是冲突了呢?  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表