完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
板子是STM32F407,SRAM 192K,但是不连续的分成2段。 现在仿照ART的办法,已经在MDK的链接配置文件中让编译器支持2段内存,我的程序中用系统的malloc free等标准函数分配内存,系统的函数还用老的rt_malloc 等管理,这样能用起来192K的全部内存吗? 现在从GITHUB上下的MASTER分支,好像MEMHEAP等的函数比如下面这些查看源代码都没实现啊? /* ; ************************************************************* /* linker script for RTArduino with GNU ld bernard.xiong 2012-02-28 |
|
相关推荐
4个回答
|
|
rtconfig.h中定义:RT_USING_MEMHEAP_AS_HEAP
|
|
|
|
看到了,把memheap.c加入工程,里面就有rt_malloc的重新定义。
不过测试了一会,频繁的分配内存,用这个新的算法很快就会报内存不够的错误,而用原来的算法没这个现象的。 还有STM32F4等内存是不连续的这种情况,好像不能直接用这个方法解决? 看了源代码,主系统函数只能从一个地址到另外一个地址分配内存,还有heap对象是用了一个固定的静态_heap实现,rt_malloc等实现是固定了用这个_heap实现。 虽然我能自己仿照这个写一个rt_malloc从我自己地址范围分配的heap这样来实现另外一段不连续的内存的管理,但是这个作为操作系统来说也太那个了吧? 还得自己弄一套malloc函数。 |
|
|
|
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等都是固定从那个范围里分配的。 |
|
|
|
使用下面代码,使用MEMHEAP后,反复调用,从一个WEB服务器中获取数据,多次后就会 httpc_new()这个里面分配不到内存了,使用常规内存基本没有这个现象。
httpc_new()里面已经用rt_malloc rt_free替换原来的内存管理。 附件中的代码需要添加到工程文件中。 [code] 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); |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1139 浏览 0 评论
IaaS+on+DPU(IoD)+下一代高性能算力底座技术白皮书
2201 浏览 0 评论
飞凌嵌入式-ELFBOARD 常用的USB接口及其不同版本介绍第1期
1087 浏览 0 评论
【Vision Board创客营连载体验】RA8D1-Vision Board上OSPI-Flash实践
1561 浏览 0 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 应用层更改引脚复用的方法
3774 浏览 0 评论
65525 浏览 21 评论
嵌入式热门DIY项目:智能机器人开源资料合集(原理图、代码、论文)
67878 浏览 22 评论
57971 浏览 32 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 17:58 , Processed in 0.550017 second(s), Total 43, Slave 37 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号