打印
[Kinetis]

Kinetis Design Studio 的malloc函数问题

[复制链接]
1590|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用KDS的大量调用malloc发现程序飞了,调试后发现malloc分配的地址越界了超过了__HeapLimit的界限,导致分配的地址空间跑到Stack空间上了,
想问一下,在KDS开发环境中如何配置malloc的地址池呢,我在用ARM的RVDS的时候都有这样的配置
_init_alloc(0xCFE00000, 0xD0000000);      //初始化堆的范围

这个KDS明显第一次分配的地址就是Heap的开始地址,但是持续分配就溢出了?
不知道大家是怎么解决这个问题的

相关帖子

沙发
leihen0525|  楼主 | 2015-12-4 12:59 | 只看该作者
工程中 *.ld文件 里面定义的,只有开始地址起作用,但是结束地址不起作用,不知道为什么,?

使用特权

评论回复
板凳
FSL_TICS_Jeremy| | 2015-12-4 15:44 | 只看该作者
建议通过参考ld,map文件,可以了解工程所占用Flash,RAM大小,以及具体地址,这样可以帮助你提前预防堆栈溢出的错误

使用特权

评论回复
地板
leihen0525|  楼主 | 2015-12-4 16:06 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-12-4 15:44
建议通过参考ld,map文件,可以了解工程所占用Flash,RAM大小,以及具体地址,这样可以帮助你提前预防堆栈 ...

你没有明白我的意思,我贴一份代码给你看一下就知道了,
void *
mallocx (unsigned nbytes)
{
    /* Get addresses for the HEAP start and end */

      extern char __HeapBase[];
      extern char __HeapLimit[];

   
    ALLOC_HDR *p, *prevp;
    unsigned nunits;

    nunits = ((nbytes+sizeof(ALLOC_HDR)-1) / sizeof(ALLOC_HDR)) + 1;

    if ((prevp = freep) == NULL)
    {
        p = (ALLOC_HDR *)__HeapBase;
        p->s.size = ( ((uint32_t)__HeapLimit - (uint32_t)__HeapBase)
            / sizeof(ALLOC_HDR) );
        p->s.ptr = &base;
        base.s.ptr = p;
        base.s.size = 0;
        prevp = freep = &base;
    }

    for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr)
    {
        if (p->s.size >= nunits)
        {
            if (p->s.size == nunits)
            {
                prevp->s.ptr = p->s.ptr;
            }
            else
            {
                p->s.size -= nunits;
                p += p->s.size;
                p->s.size = nunits;
            }
            freep = prevp;
            return (void *)(p + 1);
        }

        if (p == freep)
            return NULL;
    }
}

对于库函数来说__HeapLimit这个参数没有起作用,按照常理来说超过__HeapLimit这个界限后分配的应该是NULL,而实际不是,会一直分配,最后就溢出了,而不是你理解的

使用特权

评论回复
5
huahua1122| | 2015-12-4 17:11 | 只看该作者
建议通过参考ld,map文件,可以了解工程所占用Flash,RAM大小
sdasdasd.maoyi365.com,fsdfsd.maoyi365.com,dsfwerwer.maoyi365.com,dasdwe.maoyi365.com,sdfwe.maoyi365.com,sfsdf.maoyi365.com,daewe.maoyi365.com,dsfdf.maoyi365.com,sfdf.maoyi365.com,dffds.maoyi365.com,dfsdf.maoyi365.com,sadsad.maoyi365.com,dasdsa.maoyi365.com,adasd.maoyi365.com,dsaas.maoyi365.com,dsada.maoyi365.com,sdfsdf.maoyi365.com,rwer.maoyi365.com,dsdf.maoyi365.com,asdas.maoyi365.com,sdad.maoyi365.com,sadas.maoyi365.com,dsad.maoyi365.com,rwer1.maoyi365.com,fsdfsd1.maoyi365.com,ddsadas.maoyi365.com,sadasd.maoyi365.com,fsdfs1d.maoyi365.com,sdfdsf.maoyi365.com

使用特权

评论回复
6
FSL_TICS_Jeremy| | 2015-12-4 17:34 | 只看该作者
leihen0525 发表于 2015-12-4 16:06
你没有明白我的意思,我贴一份代码给你看一下就知道了,
void *
mallocx (unsigned nbytes)

ok, 楼主是要加载RTOS吗,所以需要内存分配处理呢?

使用特权

评论回复
7
leihen0525|  楼主 | 2015-12-7 09:04 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-12-4 17:34
ok, 楼主是要加载RTOS吗,所以需要内存分配处理呢?

倒不是,我需要设计一个FIFO队列,用链表实现,所以用到这个函数,至于碎片问题,倒也不大,就是库的这个函数没有按照我的意思去运行,我不清楚 *.ld文件里面的定义有没有和库函数里面的引用对上,倒是飞思卡尔自己写的这个函数不错,完全实现了我想要的,KDS用的GCC不知道是哪家的,我试图解决这个问题,但是没有找到和KDS里面GCC相关的信息,

使用特权

评论回复
8
FSL_TICS_Jeremy| | 2015-12-7 09:38 | 只看该作者
leihen0525 发表于 2015-12-7 09:04
倒不是,我需要设计一个FIFO队列,用链表实现,所以用到这个函数,至于碎片问题,倒也不大,就是库的这个函数没 ...

就是说楼主使用的linker file文件是一样的,只是采用的mallocx函数,一个来自库函数,一个是飞思卡尔的,结果只有飞思卡尔的是可以正常工作的,我也在KDS_Users_Guide中找到GCC的相关信息,你可以看一下


使用特权

评论回复
9
leihen0525|  楼主 | 2015-12-7 10:28 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-12-7 09:38
就是说楼主使用的linker file文件是一样的,只是采用的mallocx函数,一个来自库函数,一个是飞思卡尔的, ...

是的,感谢你提供的信息,我在这个工具链的网站找到了h ttps://answers.launchpad.net/gcc-arm-embedded/+question/218972
这个信息,看来不止我一个人为此问题困扰,国外网友也在寻找这个问题的方法,看来这个问题不是这么简单,如果syscall加入的话,可能就需要OS来支持运行,sbrk函数来辅助malloc函数运行,目前对我的项目不利,我准备用飞思卡尔提供这个函数,

使用特权

评论回复
10
leihen0525|  楼主 | 2016-1-8 09:28 | 只看该作者
经过不懈的努力找到问题了,在KSDK中的fsl_misc_utilities.c文件中有个重要的函数,在没有OS的情况下需要重载这个_sbrk函数,

使用特权

评论回复
11
小猫爱吃鱼| | 2016-1-10 15:59 | 只看该作者
楼主是要在程序运行过程当中申请内存吗

使用特权

评论回复
12
leihen0525|  楼主 | 2016-1-11 11:03 | 只看该作者
小猫爱吃鱼 发表于 2016-1-10 15:59
楼主是要在程序运行过程当中申请内存吗

恩是的,或者是用到printf函数,在printf函数中也用到了动态内存申请,因为KDS用的GCC是库是Linux下支持的,就是编译出来的程序认为在OS下的,所有系统函数都需要CALL系统软件中断的,没有嵌入式的系统需要重载这些函数.

使用特权

评论回复
13
ideafor| | 2016-1-11 19:45 | 只看该作者
leihen0525 发表于 2015-12-4 12:59
工程中 *.ld文件 里面定义的,只有开始地址起作用,但是结束地址不起作用,不知道为什么,? ...

这次终于明白了.ld文件的意义了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

55

帖子

3

粉丝