OpenEdv-开源电子网

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

关于stm32的堆栈溢出

[复制链接]

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2016-7-29 10:19:20 | 显示全部楼层 |阅读模式
30金钱
如题,怎么确定堆栈有没有溢出,下面是我的程序编译结果:Program Size: Code=25734 RO-data=5186 RW-data=140 ZI-data=2068  
然后启动文件里面有是这么一句话:
Stack_Size      EQU     0x00000400
Heap_Size       EQU     0x00000200

然后编译产生的HTM有这么一句:
Maximum Stack Usage = 232 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)
请问这些可以确定堆栈有没有溢出?怎么改呢?

最佳答案

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

OS_CFG_STAT_TASK_EN 这个宏打开, 然后自己添加一个task,在里面定时打印就可以了。 OS_ERR err; CPU_STK_SIZE size,used; OS_CPU_USAGE usage; used = tcpip_task_tcb.StkUsed; size = tcpip_task_tcb.StkSize; usage = tcpip_task_tcb.CPUUsage; printf("tcpip task Stk Size: %04d Stk usage: %0.2f%% cpu usage: %0.2f%%\r\n", size, used*100.0/size, usage/100.0); 这个是参 ...
最近爱上了stm32
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-29 10:19:21 | 显示全部楼层
OS_CFG_STAT_TASK_EN 这个宏打开,
然后自己添加一个task,在里面定时打印就可以了。

  OS_ERR err;
  CPU_STK_SIZE size,used;
  OS_CPU_USAGE usage;

used = tcpip_task_tcb.StkUsed;
size = tcpip_task_tcb.StkSize;
usage = tcpip_task_tcb.CPUUsage;                   
printf("tcpip task        Stk Size: %04d    Stk usage: %0.2f%%    cpu usage: %0.2f%%\r\n", size, used*100.0/size, usage/100.0);       

这个是参考代码,你要打印哪个task的堆栈,直接把对应的tcb换了就行。
这个是有上ucos才用到,2跟3都支持类似的方法,但是变量名是否一样我就不知道了。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
发表于 2016-7-29 16:24:21 | 显示全部楼层
我知道的不多,如下,不对求指正:
记事本打开Listings目录下xxx.map文件,查看最后三行,如下
=========================================================

    Total RO  Size (Code + RO Data)               232556 ( 227.11kB)
    Total RW  Size (RW Data + ZI Data)             53240 (  51.99kB)
    Total ROM Size (Code + RO Data + RW Data)     232928 ( 227.47kB)

=========================================================
Total RW  Size 的值一定要小于你CPU的内存,不然一定会溢出
Total ROM Size 的值一定要小于你CPU Flash的值,不然一定会出错,可能会导致烧录不进去或运行错误

当你全局变量比较大时,劲量将堆区(heap)值合理设置,否则,肯定溢出。栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,比较灵活。按某个函数的最大内存使用情况分配。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-29 17:02:52 | 显示全部楼层
你可以考虑在debug阶段将task的堆栈使用情况打印出来。几秒打印一次,如果看到堆栈使用比较满就把大小改大。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
发表于 2016-7-29 17:05:51 | 显示全部楼层
ysq7120 发表于 2016-7-29 17:02
你可以考虑在debug阶段将task的堆栈使用情况打印出来。几秒打印一次,如果看到堆栈使用比较满就把大小改大 ...

这怎么打印?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-7-29 20:03:02 | 显示全部楼层
UCOSIII貌似有统计堆栈的功能。不过我没用过。我一般都是改大,然后慢慢改小,直到不能正常工作,找一个零界点,然后适当增大一点点就好了。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-7-30 02:38:10 | 显示全部楼层
程序运行是动态的,谁也不能保证函数嵌套深度到底多少。。

尤其是中断情况下,

我一般会把它改的足够大,STM32有64KB SRAM,
就一个程序在跑,不用它,难道要供起来么
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-1 08:58:54 | 显示全部楼层
OS_CFG_STAT_TASK_EN 这个宏打开,
然后自己添加一个task,在里面定时打印就可以了。

  OS_ERR err;
  CPU_STK_SIZE size,used;
  OS_CPU_USAGE usage;

used = tcpip_task_tcb.StkUsed;
size = tcpip_task_tcb.StkSize;
usage = tcpip_task_tcb.CPUUsage;                   
printf("tcpip task        Stk Size: %04d    Stk usage: %0.2f%%    cpu usage: %0.2f%%\r\n", size, used*100.0/size, usage/100.0);       

这个是参考代码,你要打印哪个task的堆栈,直接把对应的tcb换了就行。
这个是有上ucos才用到,2跟3都支持类似的方法,但是变量名是否一样我就不知道了。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-1 08:59:23 | 显示全部楼层
OS_CFG_STAT_TASK_EN 这个宏打开,
然后自己添加一个task,在里面定时打印就可以了。

  OS_ERR err;
  CPU_STK_SIZE size,used;
  OS_CPU_USAGE usage;

used = tcpip_task_tcb.StkUsed;
size = tcpip_task_tcb.StkSize;
usage = tcpip_task_tcb.CPUUsage;                   
printf("tcpip task        Stk Size: %04d    Stk usage: %0.2f%%    cpu usage: %0.2f%%\r\n", size, used*100.0/size, usage/100.0);       

这个是参考代码,你要打印哪个task的堆栈,直接把对应的tcb换了就行。
这个是有上ucos才用到,2跟3都支持类似的方法,但是变量名是否一样我就不知道了。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-1 09:10:37 | 显示全部楼层
#define OS_CFG_STAT_TASK_EN             1u   /* Enable (1) or Disable(0) the statistics task                          */
#define OS_CFG_STAT_TASK_STK_CHK_EN     1u   /* Check task stacks from statistic task
有关的是两个宏,不是一个,第二个宏如果不打开,有些函数要自己调用,不能像我这样调用。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 03:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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