Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
星火1号_spark_星火一号_开发板
星火①号RT-Thread入门_系统静态分布分析
发布于 2024-01-02 17:23:45 浏览:712
订阅该版
[tocm] # 星火①号RT-Thread入门_系统静态分布分析 星火1号开发板采用的芯片是STM32F404ZGT6。它的存储空间包括Flash与RAM。在Keil工程编译完毕后,会有相应的程序所占用的空间提示信息,如下所示: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/77f6641cc64742fcdefb17e1daa6ea2b.png) Program Size中主要包含以下几个部分: 1. Code: 代码段,存放了程序的代码部分。 2. RO-data: 只读数据段,存放了程序中定义的常量。 3. RW-data: 读写数据段,存放了程序中,初始化为非零的全局变量。 4. ZI-data:0数据段,存放了未初始化的全局变量及初始化为0的变量。 编译完工程后,可以双击工程,打开.map文件,在该文件中可以查看各个函数所占用的尺寸及地址。如下图所示: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/3b82d3f46576678ac1dff7e9e1ee7124.png.webp) 图中是三个自定义的线程入口函数。 下图是三个自定义的线程的结构体。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/bf23c790559d51293ed45f85f29577b0.png.webp) 它们的定义方式如下图所示: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/6caca3f3567e4a8eeaf055ccf9570df6.png) 在.map文件的末尾处也描述了上面几个字段的关系,其中: 1. 代码段与只读数据段的和 = RO size, 表示程序占用的Flash大小。 2. 读写数据段与0数据段的和=RW size,运行时占用的RAM空间大小。 3. 代码段+只读数据段+读写数据段=ROM Size,表示烧写程序所占用的Flash空间大小。 在STM32上电后,默认从Flash启动,启动之后会将RW段中的RW-data搬运到RAM中,另外根据编译器给出的ZI地址和大小分配出ZI段,并将此区域清零初始化。具体过程如下图所示: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/10765cdd14afb43aaa8446cf10f39ab3.png) 剩余的动态内存堆,将作为未使用的RAM空间,应用程序申请和释放的内存块都来自该空间。 如下面例子: ``` int main(void) { rt_uint8_t *msg_ptr; msg_ptr = (rt_uint8_t *) rt_malloc(128); rt_memset(msg_ptr, 0, 128); return 0; } ``` 而全局变量则存放与RW段和ZI段中,RW存放有初始值的全局变量(常量形式的全局变量则存于RO段),未初始化的全局变量则存于ZI段如下所示: ``` const static rt_uint32_t test_const = 0x12344321; rt_uint32_t test_UNinit; rt_bool_t test_init = RT_TRUE; ``` 其中test_const为全局常量存于RO段、test_UNinit为未初始化全局变量存于ZI段、test_init为初始化全局变量存于RW段。 Corte-M4编程手册中提供了有关STM32F407的内存映射关系如下图所示: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/36cb3930f2702f63dd0952874e1f350d.png.webp) 其中: 1. 代码段的地址为0x00000000~0x1FFFFFFF。 2. SRAM:0x20000000~0x3FFFFFFF 3. 外设: 0x40000000~0x5FFFFFFF 4. 外部RAM:0x60000000-0x9FFFFFFF 5. 外部设备:0xA0000000~0XDFFFFFFF 6. 专用外围总线: 0xE0000000~0xE00FFFFF 7. 特定内存:0xE0100000~0xFFFFFFFF 其中,RT-Thread涉及到的内容包含Flash地址,SRAM地址、外设地址。 ### 总结 在RT-Thread启动的过程中,调用了rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END)函数对RT-Thread所使用的内存区域进行初始化。参数中具体的配置如下所示 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/c1d1c53e9e3147cd350e483269d44936.png) 其中HEAP_BEGIN则对应RW与ZI段结束的位置。HEAP_END则由STM32_SRAM_SIZE计算得,该参数不能大于芯片所拥有的SRAM空间。 因此后续RT-Thread中所使用的内存空间申请,都来自于该区域(如任务堆栈申请、队列申请等) 而文件中定义的STM32_FLASH_START_ADRESS、STM32_FLASH_SIZE、STM32_FLASH_END_ADDRESS区域则对应了代码段,用于存放代码程序(如线程入口、自定义函数等)。 外设地址的映射则可以查看stm32f407xx.h文件,该文件中定义了各类外设在STM32中的地址映射关系。如下所示: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/c46376053cfae8652e2f076cfcdf419f.png) 例如USART2_BASE = (APB1PERIPH_BASE + 0x4400UL) = 0x40000000+0x4400; 综上所述,RT-Thread涉及到的地址空间有如下几部分: RO段:存放程序代码与全局常量。 0x08000000~0x080FFFFFF RW段:存放已初始化的全局变量。 0X20000000~BSS段结尾处 ZI段: 存放未初始化的全局变量。 RW段+ZI段对应的地址:0x20000000~HEAP_BEGIN 动态内存堆:存放应用程序申请的内存 HEAP_BEGIN~HEAP_END 外设地址:0x40000000~0x5FFFFFFF
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
顾小小
这家伙很懒,什么也没写!
文章
4
回答
0
被采纳
0
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
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组件
热门标签
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
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部