IDE::IAR
芯片:STM32XXX
操作系统:RTOS(MICO)
1 栈
栈是程序运行过程中临时保存所需数据而在内存里分配的一小块空间。保存的数据类型一般情况下包括以下几种:
- 函数中声明的局部变量以及参数
- 函数返回值
- 中断时CPU 寄存器值
- 函数运行后返回的地址
2 确定线程栈空间大小
栈溢出会导致程序复位,要注意避免出现野指针、悬空指针这样的问题,指针初始化时要指向NULL,malloc使用的是堆空间,free之后也要把指针指向null。
排除这些会导致栈使用异常的问题,怎么确定栈空间该给多大是个问题。
首先是iar怎么设置堆栈的大小,程序堆栈的大小是由编译器来设定分配的(多线程的栈在程序内分配)。
点击project--option--linker--config,然后点击edit...,选择Stack/Heap Sizes就可以了进行设置了。

stack/Heap Size
关于设置的大小,用以下方法确定。
选择linker--Advanced,勾选上Enable stack usage analysis:

Advanced
再到Linker--List选项卡,勾选上Generate linker map file:

map
然后编译以下,就会在Output文件夹下生成.map文件。

.map
3 map
在.map文件找到STACK USAGE

STACK USAGE
最上面是一个统计表,
Program entry 304 304就是主程序占用的栈空间,iar里设置的比这个大就可以了。Max use就是使用栈空间最大的函数,Total Use就是这个线程或者终端用的总和。另外对于主线程的栈空间的使用情况,iar支持动态查看。点击View--Stack即可,深灰色表示所有的,绿线代表当前使用的,灰白色代表不可用的。再具体的解释可以看官网的介绍:

stack
[官网介绍看这里](https://www.iar.com/support/resources/articles/stack-usage-analysis-for-rx/)

iar
继续说map,看到里面还有一个Uncalled function,这个一般是中断或者自己的线程,除了主线程全是uncalled,如果想标识出来自己的线程,可以到程序中,在自己的线程前加上:
#pragma call_graph_root="mythrough_thread"这就是为什么上面截图有mythrough_thread这个线程,写法如下:

stack thread
官网有解释这部分的内容。
知道了栈的最大值,就可以对应着去调试程序中临时变量的大小,查找悬空指针和最后调整线程栈空间的分配了。