OpenEdv-开源电子网

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

COSIII任务堆栈基地址为什么是&START_TASK_STK[0]?

[复制链接]

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-10-10
在线时间
11 小时
发表于 2017-6-16 16:00:25 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 yunitongxing1200 于 2017-6-16 21:31 编辑

在正点原子的第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]呢?
视频中这一段给跳过了,请哪位给指点一下.....谢谢!

最佳答案

查看完整内容[请看2#楼]

1、UCOSIII里面的这个基地址的意思和UCOSII里面不一样,这里说的基地址就是堆栈的起始地址!那不就是START_TASK_STK[0]。UCOSIII源码里面的参数注释解释的很清楚!!!跟堆栈生长方向没关系,UCOSIII中在操作堆栈的时候会在计算出堆栈的栈顶地址的!然后操作栈顶地址! 2、堆栈初始化的时候就会自动的计算出栈顶指针,其实就是堆栈数组的最高地址,如下图:
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-6-16 16:00:26 | 显示全部楼层
本帖最后由 zuozhongkai 于 2017-6-19 14:25 编辑

1、UCOSIII里面的这个基地址的意思和UCOSII里面不一样,这里说的基地址就是堆栈的起始地址!那不就是START_TASK_STK[0]。UCOSIII源码里面的参数注释解释的很清楚!!!跟堆栈生长方向没关系,UCOSIII中在操作堆栈的时候会在计算出堆栈的栈顶地址的!然后操作栈顶地址!
93Z_3U9{ETO3IO$G~GZ~R.png
2、堆栈初始化的时候就会自动的计算出栈顶指针,其实就是堆栈数组的最高地址,如下图:
0~8HNGH)]54GRP3LKZZO.png


回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-10-10
在线时间
11 小时
 楼主| 发表于 2017-6-19 11:18:02 | 显示全部楼层
zuozhongkai 发表于 2017-6-16 16:00
1、UCOSIII里面的这个基地址的意思和UCOSII里面不一样,这里说的基地址就是堆栈的起始地址!那不就是START_ ...

解释的很清楚,谢谢了!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2021-4-21
在线时间
1 小时
发表于 2021-5-26 23:54:22 | 显示全部楼层
正解,反正我看明白了…… p_stk_base 就是指向任务分配的堆栈的起始地址,跟生长方向、存储器的地址没啥关系。真正的大家以为的基地址(也就是堆栈为空时栈顶的地址),系统会自动计算出来,然后按照一定方向生长
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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