在树莓派创建动态内存时程序崩溃,但大小未超过定义堆大小

发布于 2020-10-23 16:42:10

在树莓派用calloc创建动态内存时程序崩溃

一开始考虑的是动态内存开辟空间过大,后来翻heap大小定义时发现:

    #define RT_HW_HEAP_BEGIN (void*)&__bss_end
    #define RT_HW_HEAP_END (void*)(RT_HW_HEAP_BEGIN + 64 * 1024 * 1024)

heap大小定义为64M空间,远大于程序calloc的空间。

于是我又尝试用malloc先申请动态内存空间,然后从头开始初始化,代码如下:

    char *p = rt_malloc(60000 * 28 * 28);
    rt_kprintf("rt_malloc done\n");
    rt_thread_mdelay(500);
    int cnt = 0;
    for (int i = 0; i < 60000 * 28 * 28; ++i) {
        p[i] = (char)i;
        if (cnt++ > 1000) {
            rt_kprintf("%d\n", i);
            cnt = 0;
        }
    }

首先申请约47M的空间,然后进行初始化,大约初始化11M空间后程序崩溃。
00bfd6943e3ea36e0e524fdb84e92cfd.png
有大神知道这个问题怎么解决吗?求教

查看更多

关注者
0
被浏览
233
bigmagic
bigmagic 2020-10-24

树莓派3-64位默认起始地址是0x80000,所以系统的堆空间

#define RT_HW_HEAP_BEGIN (void*)&__bss_end
#define RT_HW_HEAP_END (void*)(RT_HW_HEAP_BEGIN + 64 * 1024 * 1024)

是0x80000+offset。系统中默认将树莓派的CPU与GPU的管道mbox的消息传递的地址设置0xc00000。需要将该处通过MMU映射成IO,按照

0xc00000 - RT_HW_HEAP_BEGIN

大约是11M左右的空间。

如果要解决你这个问题,有下面两种解决办法:

1.将RT_HW_HEAP_BEGIN改到0xc01000以后的空间上去,此时跳过了mbox的使用内存的空间。

2.系统的启动地址改成其他更高的地址空间,或者通过tftp进行引导rt-thread的启动。

非常感谢提出该问题,如果有更好的功能和更多的测试,欢迎推进树莓派bsp的发展。

3 个回答
李子成
李子成 2020-10-23

小点试试吧。

bernard
bernard 2020-10-24

还有这个限制的啊,这块可以在BSP README.md中进行些说明

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览