【FreeRTOS】FreeRTOS与stm32内置堆栈的占用情况

        在stm32的启动文件中,有对该单片机的堆栈大小进行设置,这里的启动文件中将栈大小设置为1024字节,堆大小设置为512字节。

       但在FreeRTOS的配置文件 FreeRTOSConfig.h 文件中,也使用 configTOTAL_HEAP_SIZE 宏定义了FreeRTOS所要使用到的堆大小,设置了 36*1024 代表着FreeRTOS使用的堆大小最大为36KB。

        很明显,512字节明显小于36字节,那此时就会有个疑问:为什么这样整个工程文件还能够在stm32上正常运行呢?

        首先明确一下堆栈的定义。

        栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。

        堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。

        在Cortex M3有两个栈指针,OS中,一般是在中断中使用MSP,在普通任务中使用PSP
启动文件中对堆栈大小的设置,只能改变MSP。另Cortex M3是无法设置栈大小的,只能设置栈指针!如果栈指针设置在RAM最后的位置,栈空间设置为0,编译器不会报错,程序也能运行,只要不与实际使用区域冲突就可以!

        总结:stm32启动文件中设置的堆栈大小与FreeRTOSConfig.h设置的堆栈大小之间通常情况下互不干扰(要视不同型号自带的RAM大小而定,只要两者相加不超过单片机自带的RAM大小,应该都不会互相干扰),是两个独立的内存空间。

        另外在查找这个问题的时候,发现一个分配堆栈空间不足问题原因及解决方法,这里就差不多原话搬过来:

        堆空间使用总结:用户可以自由使用的堆空间(启动文件中设置的,且使用malloc()函数进行分配),大约为堆总空间的一半。超过时系统就会死机。

        栈空间使用总结:在处理的函数,包括函数嵌套,递归,等等,都是从这个"栈"里面,来分配的.
所以,如果一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault....
这是初学者非常容易犯的一个错误.切记不要在函数里面放N多局部变量,尤其有大数组的时候!

参考:

FreeRTOS中的堆栈设置”与“系统启动文件中堆栈”的关系_lighthear的博客-CSDN博客

stm32用了FreeRTOS后,启动文件里的堆栈大小设置还有用么? (amobbs.com 阿莫电子论坛)

STM32分配堆栈空间不足问题原因及解决方法_lighthear的博客-CSDN博客_堆栈空间不足

KEIL工具之堆栈2_qrshi的博客-CSDN博客_keil堆栈窗口怎么弄出来

猜你喜欢

转载自blog.csdn.net/weixin_48896613/article/details/126166303
今日推荐