完善资料让更多小伙伴认识你,还能领取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); |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
764 浏览 0 评论
3847 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2479 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2901 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31185 浏览 11 评论
72794 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 02:19 , Processed in 0.610493 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号