首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

malloc在嵌入式系统中应用的问题?

已解决

malloc在嵌入式系统中应用的问题?

悬赏金额: 2 点威望


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



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




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



       从堆算法的本质出发,我们就可以认识到malloc在嵌入式系统中应用存在的问题。当系统长时间运行之后,内存资源将会变得越来越零散,运行之初大块的内存已经不复存在,可能只剩下很多小块的资源。所以在大块内存需求的情况下,系统将会出错,所以系统的鲁棒性将会随着系统运行时间的增长而下降。因此,在嵌入式应用中不建议使用malloc进行内存分配。
在嵌入式系统中采用静态内存分配的方法比较可靠,但是,很多应用需要进行内存的动态分配。提起动态内存分配,大家不约而同的会想到malloc函数,该函数是C语言中定义的标准内存分配函数,一般的C语言编译器都会提供该函数,例如在嵌入式应用中常用的编译开发环境Keil C、CCS以及ADS都会提供此类内存分配函数。



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




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



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