当前位置:网站首页>【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 阿莫电子论坛)
边栏推荐
- Zombie and orphan processes
- E - Many Operations (按位考虑 + dp思想记录操作后的结果
- 翁恺C语言程序设计网课笔记合集
- could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
- TinyMCE disable escape
- Software test interview questions: BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
- matlab 采用描点法进行数据模拟和仿真
- STC89C52RC的P4口的应用问题
- Software testing interview questions: the difference and connection between black box testing, white box testing, and unit testing, integration testing, system testing, and acceptance testing?
- tiup status
猜你喜欢
oracle创建表空间
QSunSync Qiniu cloud file synchronization tool, batch upload
matlab中rcosdesign函数升余弦滚降成型滤波器
oracle创建用户以后的权限问题
Huggingface入门篇 II (QA)
"Relish Podcast" #397 The factory manager is here: How to use technology to empower the law?
SV 类的虚方法 多态
node使用redis
倒计时1天!8月2日—4日与你聊聊开源与就业那些事!
电赛必备技能___定时ADC+DMA+串口通信
随机推荐
lua 如何 实现一个unity协程的工具
Mysql_13 事务
2022牛客多校训练第二场 J题 Link with Arithmetic Progression
Software test interview questions: BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
leetcode经典例题——单词拆分
机器学习(公式推导与代码实现)--sklearn机器学习库
2022杭电多校 第三场 B题 Boss Rush
网站最终产品页使用单一入口还是多入口?
E - Many Operations (按位考虑 + dp思想记录操作后的结果
Software testing interview questions: the difference and connection between black box testing, white box testing, and unit testing, integration testing, system testing, and acceptance testing?
2022多校第二场 K题 Link with Bracket Sequence I
数据类型-整型(C语言)
tiup update
Metasploit-域名上线隐藏IP
怎样进行在不改变主线程执行的时候,进行日志的记录
leetcode: 267. Palindromic permutations II
node使用redis
tiup update
软件测试面试题:请你分别画出 OSI 的七层网络结构图和 TCP/IP 的四层结构图?
刘润直播预告 | 顶级高手,如何创造财富