搜索
bottom↓
回复: 18

如何显示单片机堆栈实际使用量多少

[复制链接]

出0入0汤圆

发表于 2018-2-24 16:39:06 | 显示全部楼层 |阅读模式
本帖最后由 ccitlad 于 2018-2-24 16:48 编辑

嵌入式单片机编程过程中,程序写完下载后,需要知道堆栈实际使用量到底是多少,这样可以帮助选型更小的RAM内存的单片机

比如现在用的 飞思卡尔单片机KEAZ128  
使用的编译器是 IAR

请问 程序写完后,怎么计算或者用IAR仿真查看,实际运行中 实时的堆栈使用量 是多少?
谢谢!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2018-2-24 16:45:37 | 显示全部楼层
只是记得有,但忘记路径了

出0入14汤圆

发表于 2018-2-24 16:55:02 | 显示全部楼层
你看下程序编译出来是多少啊。。。。

加一下,然后在预留出100个字节做临时变量那些的基本够了

这个简单程序这些可以这样判断,如果是复杂程序,例如加了USB  FATFS  这些的时候可能就不适用

出0入0汤圆

发表于 2018-2-24 16:59:35 | 显示全部楼层
IAR我记得可以在编译后的工程里,找到.map文件,里面有编译出来的堆栈信息。

出10入61汤圆

发表于 2018-2-24 17:07:31 | 显示全部楼层
堆栈使用量不固定,不同的运行时情况,走的路径不一样  只能算最大的情况

出0入0汤圆

发表于 2018-2-24 17:22:38 来自手机 | 显示全部楼层
IAR调试支持统计。其他工具,如果不支持,可以将堆栈初始化为一个特定值。运行一段时间后,检查被其他值覆盖的位置

出0入0汤圆

发表于 2018-2-24 20:03:44 来自手机 | 显示全部楼层
记得以前用GCC编译stm32的时候编译完了最后的编译报告会有memory usage

出0入8汤圆

发表于 2018-2-24 21:19:25 来自手机 | 显示全部楼层
关注一下,看看有什么方法没有

出0入362汤圆

发表于 2018-2-24 22:56:43 | 显示全部楼层
栈内存看编译完的信息就好了, gcc就是arm-none-eabi-size -B main.elf就行
查看堆内存麻烦一点,如果库里有malloc之类,可以写个二分查找,找到一个n可以分配成功,n+1就分配失败的位置。
递归的简单,但是在内存够大、栈又小的场合,递归十几层肯定要爆栈,下面是非递归版本:

  1. static size_t __get_free_mem2(size_t start, size_t end)
  2. {
  3.     unsigned char *p;
  4.     while(start < end - 1) {
  5.         size_t size = (start + end) / 2;
  6.         if(size == 0)
  7.             return 0;
  8.        p = malloc(size);
  9.         if(p != NULL) {     // malloc succeeded
  10.             free(p);
  11.             start = size;
  12.         }
  13.         else {              // malloc failed
  14.             end = size - 1;
  15.         }
  16.     }
  17.     return start;
  18. }
  19. size_t get_free_mem(void)
  20. {
  21.     return __get_free_mem(0, 65536UL);     // 假设RAM最大为64k
  22. }
复制代码

出0入25汤圆

发表于 2018-2-25 11:40:09 来自手机 | 显示全部楼层
到底是堆还是栈?栈的深度要看运行时函数调用嵌套深度,堆要看运行时动态分配内存的需求量。

出0入10汤圆

发表于 2018-2-26 14:00:54 | 显示全部楼层
六楼的方法可行

出0入0汤圆

发表于 2018-2-26 14:14:03 | 显示全部楼层
6楼可以 记得某款RTOS就是这么干的

出0入0汤圆

发表于 2018-5-19 12:40:07 | 显示全部楼层
gyd0317 发表于 2018-2-26 14:14
6楼可以 记得某款RTOS就是这么干的

可以简单说下具体实现过程吗?我用CW6.3和CW5.1

出140入158汤圆

发表于 2018-5-19 14:03:30 | 显示全部楼层
程序中开个最高优先级的定时中断,统计一下SP(堆栈指针的最大最小值),显示出来就好了,然后所有操作进行一遍。

出0入8汤圆

发表于 2018-5-19 16:06:49 来自手机 | 显示全部楼层
周一试试六楼的命令,更新到makefile里面

出0入0汤圆

发表于 2018-6-12 07:36:43 | 显示全部楼层
amigenius 发表于 2018-5-19 14:03
程序中开个最高优先级的定时中断,统计一下SP(堆栈指针的最大最小值),显示出来就好了,然后所有操作进行 ...

这个方法好

出0入0汤圆

发表于 2018-6-13 15:00:33 | 显示全部楼层
amigenius 发表于 2018-5-19 14:03
程序中开个最高优先级的定时中断,统计一下SP(堆栈指针的最大最小值),显示出来就好了,然后所有操作进行 ...

定时读取SP指向地址,从中找最大最小的吗?

出140入158汤圆

发表于 2018-6-13 15:09:54 | 显示全部楼层
pending_bit 发表于 2018-6-13 15:00
定时读取SP指向地址,从中找最大最小的吗?


uint32 SP_Max=0;
uint32 SP_Min=0xFFFFFFFF;
uint32 SP_Now;

SP_Now=SP;
if(SP_Now>SP_Max) SP_Max=SP_Now;
if(SP_Now<SP_Min) SP_Min=SP_Now;

出0入0汤圆

发表于 2018-6-14 09:30:16 | 显示全部楼层
amigenius 发表于 2018-6-13 15:09
uint32 SP_Max=0;
uint32 SP_Min=0xFFFFFFFF;
uint32 SP_Now;

谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 17:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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