Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
关于memheap 管理算法问题咨询
发布于 2019-02-18 09:38:20 浏览:2934
订阅该版
* 本帖最后由 Sanjay_Wu 于 2019-2-18 09:39 编辑 * 看了《RT-Thread编程指南》,说到: 1、memheap 管理算法适用于系统含有多个地址可不连续的内存堆。 2、当分配内存块时,会先从默认内存堆去分配内存,当分配不到时会查找 memheap_item 链表,尝试从其他的内存堆上分配内存块。应用程序不用关心当前分配的内存块位于哪个内存堆上,就像是在操作一个内存堆。 **问题一:** 如IoT Board STM32L475VET6的代码: ```#if defined(RT_USING_MEMHEAP) && defined(RT_USING_MEMHEAP_AS_HEAP) rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); rt_memheap_init(&system_heap, "sram2", (void *)STM32_SRAM2_BEGIN, STM32_SRAM2_HEAP_SIZE); #else rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); #endif```在STM32L475VET6的SRAM被分为SRAM1和SRAM2两块, 理解 ``` rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); rt_memheap_init(&system_heap, "sram2", (void *)STM32_SRAM2_BEGIN, STM32_SRAM2_HEAP_SIZE);``` 代码是不是这样: 1、如果RT_USING_MEMHEAP和RT_USING_MEMHEAP_AS_HEAP这两个宏打开了,则使用memheap,那么系统内存堆的时候首先会从SRAM1(96K的那块)分配内存,当SRAM1(96K的那块)用完了再到SRAM2(32K那块)分配? **问题二:** 如何理解《RT-Thread编程指南》所讲的:在开启 memheap 之后原来的 heap 功能将被关闭,两者只可以通过打开或关闭RT_USING_MEMHEAP_AS_HEAP 来选择其一,原来的heap指的是什么?
查看更多
5
个回答
默认排序
按发布时间排序
Sanjay_Wu
2019-02-18
这家伙很懒,什么也没写!
[i=s] 本帖最后由 Sanjay_Wu 于 2019-2-18 14:12 编辑 [/i] >楼主是不是在 main 函数中申请的内存? > >有能在main 之前,操作系统就已经申请了部分内存,如果需要查看 ... --- 你好! 我在贴出我的实验代码: ``` /* 线程句柄 */ static rt_thread_t thread1 = RT_NULL; void thread1_entry(void *parameter); int main(void) { thread1 = rt_thread_create("thread1", thread1_entry, NULL, 512, 3, 20); if(thread1 != RT_NULL) { rt_thread_startup(thread1);; } else { rt_kprintf("create thread1 failed\r\n"); } return 0; } /************************************************************** 函数名称 : thread1_entry 函数功能 : 线程1入口函数 输入参数 : parameter:入口参数 返回值 : 无 备注 : 无 **************************************************************/ void thread1_entry(void *parameter) { u8 key; char *ptr = RT_NULL; while(1) { key = key_scan(0); if(key== KEY0_PRES) { ptr = rt_malloc(10); if(ptr != RT_NULL) { rt_kprintf("rt_malloc successful\r\n"); sprintf(ptr, "%s", "hello RTT"); rt_kprintf("0x%p\r\n", ptr);/* 打印分配到的地址 */ rt_kprintf("%s\r\n", ptr); } else { rt_kprintf("rt_malloc failed\r\n"); } rt_thread_mdelay(2000); if(ptr != RT_NULL) { rt_free(ptr); ptr = RT_NULL; rt_kprintf("rt_free successful\r\n"); } else { rt_kprintf("rt_free failed, ptr != NULL\r\n"); } } rt_thread_mdelay(1); } } ``` 如上打开,打开RT_USING_MEMHEAP_AS_HEAP和关闭RT_USING_MEMHEAP_AS_HEAP会导致分配到的地址不一样,我的问题是为何会不一样,那24K是用去做什么了。 我目前还在学习内核部分,ENV工具还没学习,不知如何打开memory trace。请问如果不用ENV工具,如何才能打开memory trace功能?。 Thanks
yangjie
认证专家
2019-02-18
hello
1、是的 2、打开RT_USING_MEMHEAP_AS_HEAP 之后,实现的算法不同,比如rt_malloc()函数的实现
Sanjay_Wu
2019-02-18
这家伙很懒,什么也没写!
>1、是的 >2、打开RT_USING_MEMHEAP_AS_HEAP 之后,实现的算法不同,比如rt_malloc()函数的实现 ... --- 你好! 我进行了如下实验: (1)在打开RT_USING_MEMHEAP_AS_HEAP 之后,第一次用rt_malloc申请内存分配到的地址是:0x200072dc (2)不打开RT_USING_MEMHEAP_AS_HEAP第一次用rt_malloc申请内存分配到的地址是:0x200011e0 0x200072dc - 0x200011e0 = 24K,请问打开RT_USING_MEMHEAP_AS_HEAP之后这前面24K是用去做什么了? Thanks
还没想好
2019-02-18
这家伙很懒,什么也没写!
问题2: 不开启 RT_USING_MEMHEAP_AS_HEAP 时,rt_system_heap_init 函数是调用的是 rt-thread/src/mem.c 文件下的。 开启 RT_USING_MEMHEAP_AS_HEAP 后,rt_system_heap_init 函数是调用的是 rt-thread/src/memheap.c 文件下的。 相当于开启 RT_USING_MEMHEAP_AS_HEAP,默认的内存管理算法失效了。 这样子解释不知楼主能否明白
还没想好
2019-02-18
这家伙很懒,什么也没写!
>你好! > >我进行了如下实验: --- 楼主是不是在 main 函数中申请的内存? 有能在main 之前,操作系统就已经申请了部分内存,如果需要查看内存被哪个线程分配的,分配了多少,可以打开 memory trace 选项,在msh 模式下,输入 mem_trace(好像是这样) 命令查看内存使用情况。 下面截图是打开 memory trace 选项。 [attach]7553[/attach]
撰写答案
登录
注册新账号
关注者
0
被浏览
2.9k
关于作者
Sanjay_Wu
这家伙很懒,什么也没写!
提问
13
回答
32
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
STM32H7R7运行CherryUSB
2
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
3
使用RC522软件包驱动FM1722
4
常量数据类型和表达式陷阱分享
5
进行i2c驱动移植的经验总结
热门标签
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
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部