Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32
启动代码
STM32启动代码堆栈分配
发布于 2021-04-05 00:12:01 浏览:2208
订阅该版
本人初学STM32和RT-Thread,在看视频教程时有个疑问,启动代码里有堆栈大小的定义,代码如下: Stack_Size EQU 0x00000400 Heap_Size EQU 0x00000200 根据RT-Thread视频中例程,Map信息如下: Total RO Size (Code + RO Data) 63528 ( 62.04kB) Total RW Size (RW Data + ZI Data) 22576 ( 22.05kB) Total ROM Size (Code + RO Data + RW Data) 63676 ( 62.18kB) 不是说栈是编译器分配的RAM空间吗?这里的数据量明显超出了Stack_Size!为何没有出现运行错误或其他警告? 还有堆大小定义,既然栈是编译器分配的,剩余RAM空间其实被RT-Thread进行动态管理了,那启动代码堆大小定义还有意义吗? 归根结底就是想问:这里的栈和堆到底是给什么准备的?实际应用中如何知道配置多大? 请各位高手解惑。
查看更多
5
个回答
默认排序
按发布时间排序
cxhxy12345
2021-04-05
这家伙很懒,什么也没写!
Stack_Size是栈区得大小,栈式由编译器自动分配和释放。例如在切换线程时,要将原来得线程数据压栈,将要执行得线程数据从栈中取出。 Heap_Size是堆区得大小,堆由程序员自主分配和释放。 你看到得RW是程序运行中在芯片RAM区占用得大小。 你可以看https://www.rt-thread.org/document/site/programming-manual/memory/memory/下内存管理得介绍,因该有所帮助
Eureka1024
2021-04-05
嵌入式软件开发工程师一枚
对于第一个问题,map 文件显示的程序内存不仅仅包含堆栈,你可以看看[RT-Thread 启动流程](https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/basic/basic?id=rt-thread-%e7%a8%8b%e5%ba%8f%e5%86%85%e5%ad%98%e5%88%86%e5%b8%83)里面的 RT-Thread 程序内存分布 小节。 对于第二个问题,是的,所以此处的 Heap_Size 可以设置为0,见讨论:[https://github.com/RT-Thread/rt-thread/issues/1399](https://github.com/RT-Thread/rt-thread/issues/1399) 对于第三个问题,堆的情况看问题2的回答。至于栈,由于线程中使用的栈是要么是动态分配、要么是自己预先定义(全局数组),所以线程没有使用到这里的所谈及的栈,不过这里的栈(称为主栈)在于线程启动前以及中断中使用。突然发现有篇回答非常不错:[https://club.rt-thread.org/ask/question/423854.html](https://club.rt-thread.org/ask/question/423854.html) 至于配置多大,我觉得要看你的具体操作了(比如中断函数内的操作是否大量使用栈)。由于平时使用的时候,配置的都挺足,也没遇到过主栈这个问题,这方面经验不是非常丰富,如果有大佬能具体点的陈述就好了。
flashman2002
2021-04-05
这家伙很懒,什么也没写!
针对RTT,线程栈设定有2种方式,静态(通过静态数组)和动态。启动代码里的Stack_Size是1024 Bytes,这个RAM空间是给启动代码做函数调用时用的。rtt启动是一个比较复杂的过程,具体内容可以查阅网站的相关文档。
YZRD
2021-04-05
这家伙很懒,什么也没写!
编译出来大小和启动时设置的大小无关
面壁者
2021-04-05
这家伙很懒,什么也没写!
看个各位的解答,我大致总结了一下,如有错请各位斧正: 1、启动代码里的Stack_Size是1024 Bytes,这个RAM空间是给函数调用(包括中断)保存上下文用的,是真正的“主栈”;如果再定义变量(包括数组),编译器会把地址分配在这1024 byte之外。 2、编译器是不知道有没有RTOS的,所以Stack_Size定义的空间肯定不是给RT-Thread线程用的,RT-Thread的线程栈通过定义一个数组获取RAM空间,这个空间肯定在Stack_Size定义的空间之外。 3、没有RTOS的情况下,只要保证函数调用的层次别太深,压栈别超过1024 bytes的容量就行。(其实如果所有的寄存器都保存,也不过几十个字节,不会有人真调用几十级吧,那程序就太乱了,实在不行就扩大Stack_Size,哈哈...) 4、有RTOS的情况下,Stack_Size空间在内核启动之前有用,内核调度启动之后,每个线程都有自己的栈,真正的硬件SP寄存器在不同的线程栈切换... 5、启动代码里的Heap_Size,这个RAM空间是给编译器自带的malloc准备的,其实在没有使用RTOS的情况下,动态内存管理必要性不大,完全可以设置成0. 6、在RT-Thread里,可以动态管理的RAM是:所有RAM空间 - Stack_Size空间 - Heap_Size空间 - 所有变量空间(包括线程栈,就是数组),其实就是:所有RAM空间 - 编译器固定分配的空间。在没有使用动态内存管理的系统,这部分RAM是永远也用不到的。 说道最后,我脑子又出现一个小疑问:假如定义一个指针,强制指向一个高地址,而这个地址又被rt_malloc分配了,那通过这个指针更改内容会把系统搞崩溃吗?
撰写答案
登录
注册新账号
关注者
0
被浏览
2.2k
关于作者
面壁者
这家伙很懒,什么也没写!
提问
2
回答
2
被采纳
0
关注TA
发私信
相关问题
1
裸机工程移植 RT-Thread
2
Keil MDK 移植 RT-Thread Nano
3
移植 Nano,rt_thread_mdelay()延迟时间不对
4
裸机工程移植 RT-Thread内核
5
关于利用0x68000000作为扩展sram?
6
STM32F413 SD 卡写入速度提升方法
7
STM32 RTC 闹钟
8
http_ota 提示no memory
9
studio中怎么把PB3 和PA15引脚设置为普通IO口使用?
10
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
freemodbus主机在freertos的适配,参考rtthread例程
2
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
3
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
4
RT-Thread EtherKit开源以太网硬件正式发布
5
还在担心bsp不好维护吗?快使用yml管理主线bsp
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
12
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
用户名由3_15位
14
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
8
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部