Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
memheap
启用了新的MEMHEAP管理模式后,rt_malloc等老的函数咋办?
发布于 2013-12-12 12:19:59 浏览:5374
订阅该版
板子是STM32F407,SRAM 192K,但是不连续的分成2段。 用新的MEMHEAP模式主要想用起来192K的内存,但是会屏蔽掉原来的HEAP模式,而rt_malloc等老的HEAP函数大量的用在了内核文件中,这个咋办啊? 现在仿照ART的办法,已经在MDK的链接配置文件中让编译器支持2段内存,我的程序中用系统的malloc free等标准函数分配内存,系统的函数还用老的rt_malloc 等管理,这样能用起来192K的全部内存吗? 现在从GITHUB上下的MASTER分支,好像MEMHEAP等的函数比如下面这些查看源代码都没实现啊? ```c /* memory heap object interface */ rt_err_t rt_memheap_init(struct rt_memheap *memheap, const char *name, void *start_addr, rt_uint32_t size); rt_err_t rt_memheap_detach(struct rt_memheap *heap); void* rt_memheap_alloc(struct rt_memheap *heap, rt_uint32_t size); void *rt_memheap_realloc(struct rt_memheap* heap, void* ptr, rt_size_t newsize); void rt_memheap_free(void *ptr); #endif ``` 我的stm32_rom.sct内容: ```c ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00100000 ; load region size_region { ER_IROM1 0x08000000 0x00100000 ; load address = execution address { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_CCM 0x10000000 0x00010000 ; RW data { .ANY (+RW +ZI) } RW_SRAM 0x20000000 0x00020000 { .ANY (dma_buffer) .ANY (ram_func) } } ``` stm32_rom.ld:文件中内容 ``` /* * linker script for RTArduino with GNU ld * bernard.xiong 2012-02-28 */ /* Program Entry, set to mark it as "used" and avoid gc */ MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512k flash */ CCM (rw) : ORIGIN = 0x10000000, LENGTH = 64k /* 64K sram */ SRAM (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ } ENTRY(Reset_Handler) _system_stack_size = 0x200; ``` 下载附件[nanohttp.rar](/uploads/6269_5f3bb318680fc9b74cd8274fa80a442d.rar)
查看更多
9
个回答
默认排序
按发布时间排序
bernard
2013-12-13
这家伙很懒,什么也没写!
rtconfig.h中定义:RT_USING_MEMHEAP_AS_HEAP
lijiangchun9981
2013-12-13
这家伙很懒,什么也没写!
看到了,把memheap.c加入工程,里面就有rt_malloc的重新定义。 不过测试了一会,频繁的分配内存,用这个新的算法很快就会报内存不够的错误,而用原来的算法没这个现象的。 还有STM32F4等内存是不连续的这种情况,好像不能直接用这个方法解决? 看了源代码,主系统函数只能从一个地址到另外一个地址分配内存,还有heap对象是用了一个固定的静态_heap实现,rt_malloc等实现是固定了用这个_heap实现。 虽然我能自己仿照这个写一个rt_malloc从我自己地址范围分配的heap这样来实现另外一段不连续的内存的管理,但是这个作为操作系统来说也太那个了吧? 还得自己弄一套malloc函数。
lijiangchun9981
2013-12-13
这家伙很懒,什么也没写!
bernard: 我看了下你的ART源代码, 1.编译器要启用STM32F4的2段内存支持。 我看到你用了自己定义的stm32_rom.scr这个自定义的文件让编译器启用。这个测试通过没有问题。 2.启用memheap: 可是这个看过源代码,在startup.c系统启动里面调用的初始化代码,只能支持固定的一段内存吧。你的另外一段内存如何管理没看到代码在哪里? ``` #ifdef RT_USING_HEAP rt_system_heap_init((void*)HEAP_BEGIN, (void*)HEAP_END); #endif ``` 这个代码里只能固定一个地址范围,然后rt_malloc等都是固定从那个范围里分配的。
grissiom
2013-12-15
这家伙很懒,什么也没写!
关于多段地址的,请看 [https://github.com/RT-Thread/rt-thread/blob/master/src/memheap.c#L622](https://github.com/RT-Thread/rt-thread/ ... eap.c#L622) 的代码。 关于那个频繁分配内存会导致内存不够用的情况,方便提供一个可以复现问题的示例代码么?多谢。
lijiangchun9981
2013-12-16
这家伙很懒,什么也没写!
查看了代码,如果是rt_malloc 从主内存中分配不到了,会从`rt_object_container[RT_Object_Class_MemHeap]`这个里面找一块内存分配。 可是搜索了整个项目,都没看到如何使用或者是把另外一段内存保存到这个数据结构的代码,原谅我这个RTT的菜鸟,请给个示范代码把0x1000 0000 开头的64K内存如何添加到上面的这个数据结构中? ```c struct rt_memheap m_heap rt_memheap_init(&m_heap, “name”, 0x10000000, 64000) ``` 调用这个函数就应该把一个从0x1000 0000 ,64K大小的内存块保存到系统全局内存中了吧
lijiangchun9981
2013-12-16
这家伙很懒,什么也没写!
使用下面代码,使用MEMHEAP后,反复调用,从一个WEB服务器中获取数据,多次后就会 httpc_new()这个里面分配不到内存了,使用常规内存基本没有这个现象。 httpc_new()里面已经用rt_malloc rt_free替换原来的内存管理。 附件中的代码需要添加到工程文件中。 ``` httpc_conn_t *conn; hresponse_t *res; herror_t status; char tmp[10]; char rpc_req[]="get" // DPRINTF(("content-length: %d", strlen(rpc_req))); /* Transport via HTTP */ if (!(conn = httpc_new())) { rt_kprintf(("Unable to create HTTPC client! ")); return NULL; } /* Set rpc call headr */ httpc_set_basic_authorization(conn,user,pass); httpc_set_header(conn, HEADER_ACCEPT, "*/*"); httpc_set_header(conn, HEADER_CONTENT_TYPE, "application/json"); sprintf(tmp, "%d", (int) strlen(rpc_req)); httpc_set_header(conn, HEADER_CONTENT_LENGTH, tmp); /* POST rpc */ if ((status = httpc_post_begin(conn, “http://www.baidu.com”)) != H_OK) { httpc_close_free(conn); rt_kprintf(("Httpc_post_begin fail !!!")); return NULL; } if ((status = http_output_stream_write_string(conn->out, rpc_req)) != H_OK) { httpc_close_free(conn); rt_kprintf(("Httpc_output_stream fail !!!")); return NULL; } if ((status = httpc_post_end(conn, &res)) != H_OK) { httpc_close_free(conn); rt_kprintf(("Httpc_post_end fail !!!")); return NULL; } if (res == NULL || res->in == NULL){ rt_kprintf(("Can not get response !!!")); } if (res->errcode != 200){ rt_kprintf(("HTTP Status Not 200 OK, Discard this response ", res->errcode, res->desc)); } /* Read the reponse content */ while(http_input_stream_is_ready(res->in)) { read_len = http_input_stream_read(res->in, buffer, MAX_BUFFER_SIZE); buffer[read_len] = ' '; } hresponse_free(res); httpc_close_free(conn); ```
bernard
2013-12-17
这家伙很懒,什么也没写!
论坛帖子有加代码高亮的功能,可否把帖子上的代码加加?
grissiom
2013-12-17
这家伙很懒,什么也没写!
>查看了代码,如果是rt_malloc 从主内存中分配不到了,会从rt_object_container[RT_Object_Class_MemHeap]这个里面找一块内存分配。 --- 这是一个链表,初始化 memheap 之后自动就加入了。
撰写答案
登录
注册新账号
关注者
0
被浏览
5.4k
关于作者
lijiangchun9981
这家伙很懒,什么也没写!
提问
1
回答
4
被采纳
0
关注TA
发私信
相关问题
1
关于利用0x68000000作为扩展sram?
2
STM32F407 添加外部 SRAM
3
RTT内存使用情况的问题
4
ramfs中的memheap问题
5
rt_system_heap_init函数加入多块物理内存是否有计划解决
6
list_memheap 显示的 max used size
7
求助,外部SDRAM使用memheap管理后系统起不来了
8
C++应用memheap内存管理方法挂死
9
rt_memheap_free 引起的死机
10
探索者f407 使用rt_malloc分配外部sram作为lvgl缓存异常?
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
4
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部