当前位置:网站首页>【FreeRTOS】FreeRTOS与stm32内置堆栈的占用情况
【FreeRTOS】FreeRTOS与stm32内置堆栈的占用情况
2022-08-05 00:30:00 【谢老板不用蟹】
在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 阿莫电子论坛)
边栏推荐
- 数据类型及输入输出初探(C语言)
- 僵尸进程和孤儿进程
- Software testing interview questions: What are the three modules of LoadRunner?
- More than 2022 cattle school training topic Link with the second L Level Editor I
- The applicable scenarios and common product types of the KT148A electronic voice chip ic solution
- 2022杭电多校第一场 1004 Ball
- E - Distance Sequence (prefix and optimized dp
- tiup uninstall
- 2022牛客多校第三场 J题 Journey
- 软件测试面试题:软件测试类型都有哪些?
猜你喜欢
How to automatically push my new articles to my fans (very simple, can't learn to hit me)
性能测试如何准备测试数据
导入JankStats检测卡帧库遇到问题记录
could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
node使用redis
TinyMCE禁用转义
【论文笔记】—低照度图像增强—Unsupervised—EnlightenGAN—2019-TIP
Mysql_14 存储引擎
软件质量评估的通用模型
[230]连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots
随机推荐
[230]连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots
[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots
关于我仔细检查审核过关于工作人员页面,返回一个所属行业问题
tiup telemetry
【无标题】
软件测试面试题:您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程?
【LeetCode】Summary of Two Pointer Problems
阅读笔记:如何理解DevOps?
SV class virtual method of polymorphism
GO中sync包自由控制并发的方法
tensor.nozero(),面具,面具
软件测试面试题:软件测试类型都有哪些?
软件测试面试题:LoadRunner 分为哪三个模块?
软件测试面试题:一套完整的测试应该由哪些阶段组成?
测试经理要不要做测试执行?
软件测试面试题:测试用例通常包括那些内容?
00、数组及字符串常用的 API(详细剖析)
Senior game modelers tell newbies, what are the necessary software for game scene modelers?
tiup telemetry
E - Many Operations (bitwise consideration + dp thought to record the result after the operation