Board logo

标题: malloc在嵌入式系统中应用的问题? [打印本页]

作者: cuicaifeng    时间: 2010-12-9 09:53     标题: malloc在嵌入式系统中应用的问题?


作者: 电子工匠    时间: 2010-12-9 09:53

在嵌入式系统中采用静态内存分配的方法比较可靠,但是,很多应用需要进行内存的动态分配。提起动态内存分配,大家不约而同的会想到malloc函数,该函数是C语言中定义的标准内存分配函数,一般的C语言编译器都会提供该函数,例如在嵌入式应用中常用的编译开发环境Keil C、CCS以及ADS都会提供此类内存分配函数。



       编译器提供的malloc内存分配函数的实现基于堆算法。动态内存区域是一个堆空间,分配内存时总是从堆的头部向后查找,分配一块满足大小的一段空间,释放资源时检查是否可以与堆空间中的临近空闲资源合并成大块,如果可以合并,那么堆空间中的连续资源将会增加,否则将会产生一个新块链接在堆空间中的链表中。用于内存管理的堆空间链表示意如下图:




    在系统初始化时,动态分配的堆空间为一整块资源,随着内存资源的不断分配、释放,堆空间将会被不断切分,切分成很多细粒度的空闲块资源。当堆空间被切分成很多小块时,系统就不可能再为大块需求分配资源了。虽然细粒度的块聚合起来能够满足应用需求,但是,堆算法已经无能为力了,就会出现malloc分配失败的情况。



       从堆算法的本质出发,我们就可以认识到malloc在嵌入式系统中应用存在的问题。当系统长时间运行之后,内存资源将会变得越来越零散,运行之初大块的内存已经不复存在,可能只剩下很多小块的资源。所以在大块内存需求的情况下,系统将会出错,所以系统的鲁棒性将会随着系统运行时间的增长而下降。因此,在嵌入式应用中不建议使用malloc进行内存分配。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0