硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2062|回复: 7
收起左侧

[μCOS-III] UCOSIII堆栈使用顺序疑问

[复制链接]

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-10-15 22:22:41 | 显示全部楼层 |阅读模式
有一个全局数组前几个字节总是偶尔被莫名的修改,仿真发现数组地址前面是任务的堆栈地址,于是怀疑是任务堆栈溢出引起的数组被修改。
对几个任务堆栈空间数据查看时发现一个奇怪的现象,堆栈的前半段一直保持为0,反倒是后半段的数据总是在变化。
疑问就是,任务如何使用堆栈的呢?难道是从后向前使用?
UC监测出来的堆栈使用率是平均值吧,对于任务偶尔突发的堆栈溢出,有没有什么更便捷的方式检测呢?
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-10-15 22:31:39 | 显示全部楼层
看了几篇资料,基本上确定堆栈是从栈底向栈顶依次顺序使用,肉眼看来就是先用的数组后端,
呢么如果堆栈溢出,是覆盖这块内存前面的空间还是后面的空间呢?
回复

使用道具 举报

19

主题

373

回帖

430

积分

高级会员

积分
430
发表于 2018-10-16 00:02:10 | 显示全部楼层
假设CPU构架
栈的增长为:--(向下)
数组的增长为:++(向上)
应该会覆盖后面的空间
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-10-16 01:07:27 | 显示全部楼层
CM内核是向下生长的满栈。详情我在我们uCOS-III教程里面对这个问题讲解的比较清楚。

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-10-16 08:59:44 | 显示全部楼层
h_007 发表于 2018-10-16 00:02
假设CPU构架
栈的增长为:--(向下)
数组的增长为:++(向上)

STM32如果在内存中的顺序依次是(数组1、任务堆栈、数组2),那么如果任务堆栈溢出的话,是异常修改数组1的内容还是数组2的内容?
回复

使用道具 举报

19

主题

373

回帖

430

积分

高级会员

积分
430
发表于 2018-10-16 12:01:07 | 显示全部楼层
/* 全局数组 */
/* 假设按照内存地址低 -> 高储存 */
uint32_t array_1[100];
uint32_t stk[100];
uint32_t array_2[100];

/* CPU构架向上增长 */
if (&array[0] < &array[99])
{
  栈的增长为:--(向下)
  数组的增长为:++(向上)
  溢出修改array_1
}
else
{
   栈的增长为:++(向上)
   数组的增长为:--(向下)
   溢出修改array_2
}
回复

使用道具 举报

19

主题

373

回帖

430

积分

高级会员

积分
430
发表于 2018-10-16 12:04:35 | 显示全部楼层
以上示意而已,不一定准确。。。。这个问题跟CPU构架有关
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-10-17 02:59:55 | 显示全部楼层
云琴箫龙 发表于 2018-10-16 08:59
STM32如果在内存中的顺序依次是(数组1、任务堆栈、数组2),那么如果任务堆栈溢出的话,是异常修改数组1 ...

数组1.
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 16:14 , Processed in 0.400393 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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