参考
stackflow相关讨论
原理
通过参考链接,可知探测Stack
的最大深度是先在stack
中填充不常用的特定值,然后实时检测这些值哪些发生了变化,变化的表示使用到了这个空间,如果程序完全遍历后,有些值还是没变,则表示这些空间是没有使用到的。 本文是针对没有使用RTOS
的情况下使用的,即查看的是系统stack
空间的使用情况。不过使用RTOS
的任务栈也可以通过这种方式确认任务栈的使用情况,但是一般RTOS
都已经集成了这个功能,不需要自己实现。
实现
先实现如下代码:
void stack_fill ( void )
{ # define STACK_SIZE ( 0x600 ) extern uint32_t __initial_sp; uint8_t buf[ STACK_SIZE] ; memset ( buf, 0x57 , STACK_SIZE) ; LOG_DBG ( "stackTop[%p] bufAddr[%p] stack_area[last] = [%d]\n" , & __initial_sp, & buf, buf[ STACK_SIZE- 1 ] ) ;
}
在初始化完成后调用以上函数,编译成功后烧录并进入仿真,通过watch memory
实时查看内存数据: 然后全速运行程序,查看还有哪些数据没有被改变,就可以相应调整stack
大小了;比如:
注意
在stack_fill()
函数中,需要根据实际需求更改STACK_SIZE
的值,要尽可能得填充所有当前剩余的栈空间,但是不能超出剩余的栈空间。可以把这个函数先放在LOG
使能后的地方,查看一下__initial_sp
栈顶地址是多少,然后根据在startup.s
文件中定义的stack size
,定义一个合理的STACK_SIZE
值; 如果想要获得最大的栈使用空间,就需要保证所有的代码都被遍历。这种方式只能看到已经运行代码的最大栈使用空间!