ccitlad 发表于 2018-2-24 16:39:06

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

本帖最后由 ccitlad 于 2018-2-24 16:48 编辑

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

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

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

gsq19920418 发表于 2018-2-24 16:45:37

只是记得有,但忘记路径了

isakura 发表于 2018-2-24 16:55:02

你看下程序编译出来是多少啊。。。。

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

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

dengmengcan 发表于 2018-2-24 16:59:35

IAR我记得可以在编译后的工程里,找到.map文件,里面有编译出来的堆栈信息。

tcm123 发表于 2018-2-24 17:07:31

堆栈使用量不固定,不同的运行时情况,走的路径不一样只能算最大的情况

xivisi 发表于 2018-2-24 17:22:38

IAR调试支持统计。其他工具,如果不支持,可以将堆栈初始化为一个特定值。运行一段时间后,检查被其他值覆盖的位置

大傻师 发表于 2018-2-24 20:03:44

记得以前用GCC编译stm32的时候编译完了最后的编译报告会有memory usage

了无 发表于 2018-2-24 21:19:25

关注一下,看看有什么方法没有

tomzbj 发表于 2018-2-24 22:56:43

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

static size_t __get_free_mem2(size_t start, size_t end)
{
    unsigned char *p;
    while(start < end - 1) {
      size_t size = (start + end) / 2;
      if(size == 0)
            return 0;
       p = malloc(size);
      if(p != NULL) {   // malloc succeeded
            free(p);
            start = size;
      }
      else {            // malloc failed
            end = size - 1;
      }
    }
    return start;
}
size_t get_free_mem(void)
{
    return __get_free_mem(0, 65536UL);   // 假设RAM最大为64k
}

lswood 发表于 2018-2-25 11:40:09

到底是堆还是栈?栈的深度要看运行时函数调用嵌套深度,堆要看运行时动态分配内存的需求量。

andrew8415 发表于 2018-2-26 14:00:54

六楼的方法可行

gyd0317 发表于 2018-2-26 14:14:03

6楼可以 记得某款RTOS就是这么干的

zw_7627 发表于 2018-5-19 12:40:07

gyd0317 发表于 2018-2-26 14:14
6楼可以 记得某款RTOS就是这么干的

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

amigenius 发表于 2018-5-19 14:03:30

程序中开个最高优先级的定时中断,统计一下SP(堆栈指针的最大最小值),显示出来就好了,然后所有操作进行一遍。

了无 发表于 2018-5-19 16:06:49

周一试试六楼的命令,更新到makefile里面

yulutong 发表于 2018-6-12 07:36:43

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

这个方法好

pending_bit 发表于 2018-6-13 15:00:33

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

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

amigenius 发表于 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;

pending_bit 发表于 2018-6-14 09:30:16

amigenius 发表于 2018-6-13 15:09
uint32 SP_Max=0;
uint32 SP_Min=0xFFFFFFFF;
uint32 SP_Now;


谢谢分享
页: [1]
查看完整版本: 如何显示单片机堆栈实际使用量多少