如何显示单片机堆栈实际使用量多少
本帖最后由 ccitlad 于 2018-2-24 16:48 编辑嵌入式单片机编程过程中,程序写完下载后,需要知道堆栈实际使用量到底是多少,这样可以帮助选型更小的RAM内存的单片机
比如现在用的 飞思卡尔单片机KEAZ128
使用的编译器是 IAR
请问 程序写完后,怎么计算或者用IAR仿真查看,实际运行中 实时的堆栈使用量 是多少?
谢谢!! 只是记得有,但忘记路径了 你看下程序编译出来是多少啊。。。。
加一下,然后在预留出100个字节做临时变量那些的基本够了
这个简单程序这些可以这样判断,如果是复杂程序,例如加了USBFATFS这些的时候可能就不适用 IAR我记得可以在编译后的工程里,找到.map文件,里面有编译出来的堆栈信息。 堆栈使用量不固定,不同的运行时情况,走的路径不一样只能算最大的情况 IAR调试支持统计。其他工具,如果不支持,可以将堆栈初始化为一个特定值。运行一段时间后,检查被其他值覆盖的位置 记得以前用GCC编译stm32的时候编译完了最后的编译报告会有memory usage 关注一下,看看有什么方法没有 栈内存看编译完的信息就好了, 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
}
到底是堆还是栈?栈的深度要看运行时函数调用嵌套深度,堆要看运行时动态分配内存的需求量。 六楼的方法可行 6楼可以 记得某款RTOS就是这么干的 gyd0317 发表于 2018-2-26 14:14
6楼可以 记得某款RTOS就是这么干的
可以简单说下具体实现过程吗?我用CW6.3和CW5.1 程序中开个最高优先级的定时中断,统计一下SP(堆栈指针的最大最小值),显示出来就好了,然后所有操作进行一遍。 周一试试六楼的命令,更新到makefile里面 amigenius 发表于 2018-5-19 14:03
程序中开个最高优先级的定时中断,统计一下SP(堆栈指针的最大最小值),显示出来就好了,然后所有操作进行 ...
这个方法好 amigenius 发表于 2018-5-19 14:03
程序中开个最高优先级的定时中断,统计一下SP(堆栈指针的最大最小值),显示出来就好了,然后所有操作进行 ...
定时读取SP指向地址,从中找最大最小的吗? 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; amigenius 发表于 2018-6-13 15:09
uint32 SP_Max=0;
uint32 SP_Min=0xFFFFFFFF;
uint32 SP_Now;
谢谢分享
页:
[1]