您的位置:首页 > 其它

SylixOS_LWIP协议栈学习:动态内存管理

2017-04-11 15:51 302 查看
1.LWIP中的动态内存管理有三种方式

    运行时C库自带的内存分配方式、LWIP中自带的内存堆(HEAP)分配方式、内存池(POOL)分配方式。

    内存堆的特点是对一块事先分配好的内存块进行合理有效的组织和管理,主要用于任意大小的内存分配。缺点是容易产生内存碎片。

    内存池的特点是预先开辟许多固定大小的内存块组织成链表,实现快速分配/回收,且不会产生内存碎片,但大小固定会带来一定内存浪费。

2.LWIP宏编译开关

    SylixOS在(/libsylixos/SylixOS/include/network/lwip/opt.h)中通过宏配置选不同的内存管理方式:

    若定义MEM_LIBC_MALLOC =
1,直接使用C库中的malloc、free来分配动态内存;否则使用LWIP自带的mem_malloc、mem_free等函数。

    若定义MEMP_MEM_MALLOC =
1,则用内存堆来实现内存池分配,使用这种方式得考虑是否能忍受内存堆分配带来的时间延迟。

    若定义MEM_USE_POOLS  =
1,则用内存池来实现内存堆的分配,使用这种方式得考虑是否能忍受因为POOL内存固定大小而带来的内存浪费。

总结:

    C库中的malloc、free和LWIP自带的mem_malloc、mem_free具有很大相似性,这两种策略使用者只能从中选择一种,通过MEM_LIBC_MALLOC来实现。

  当它被定义为 1 时则使用标准 C运行时库自带的内存分配策略,而为 0 时则使用 LWIP 自身的动态内存堆分配策略。

    在(/libsylixos/SylixOS/config/net/net_perf_cfg.h)中,对于内存堆和内存池的大小是可以配置的,通过合理的配置可以有效提升性能。

  LW_CFG_LWIP_MEM_SIZE定义了内存堆区大小,LW_CFG_LWIP_POOL_SIZE和LW_CFG_LWIP_NUM_POOLS定义了内存池的大小和数量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: