nordic SDK 的几种内存管理库

Block memory allocator(app_balloc)

该分配方式先定义固定元素个数的内存池,元素的长度也是固定的。之后每一次也只能分配一个元素的内存,假如内存池满了,就分配不了了。该分配方式不会产生内存垃圾碎片,但是也不能动态设定每一次获取的内存大小。需要根据可能用到的最大内存块来统一定义元素的大小,会造成很多的内存浪费。

  • 定义BALLOC

NRF_BALLOC_DEF(_name, _element_size, _pool_size)

element_size: 元素的大小

_pool_size:定义的内存区域中包含多少个元素

  • 初始化balloc

nrf_balloc_init (nrf_balloc_t const *p_pool)

  • 分配一个元素的内存空间

 nrf_balloc_alloc (nrf_balloc_t const *p_pool)

  • 释放元素的内存空间

nrf_balloc_free (nrf_balloc_t const *p_pool, void *p_element)

Memory_manger

  • 该分配方式可以分配不定长度的内存区域。通过配置,可以定义这七种等级的内存区域的长度和数量以及是否使能:xxsmall, xsmall, small, medium, large, xlarge, xxlarge。
  • 分配内存的原理是你要获取内存的大小,去分配和预定义等级的区域做对比,优先选用更小的等级,如果小等级的都被分配满了就去更大一级的内存区域分配,这样循环往上查找。
  • 例如在SDK_CONFIG中配置使用 small, medium, large这三种等级的内存区域,分别对应大小为10bytes、20bytes、30bytes,每一种等级下都有3个可分配的名额。现在需要一个8bytes的内存调用nrf_malloc就会从small名额中拿出一个。如果3个名额都用完了,再次申请8byte的内存时候small区域已经没有名额了,就会从medium区域下获取名额。这里有个关键的地方就是medium等级一块儿是20个bytes,只申请的8bytes同样也是占用了一个名额,后面的12bytes就会被认为已经是被占用的了,这样也就造成了一定内存的浪费。
  • 该种分配不会产生内存碎片,但是也会造成少量的内存浪费。

Memobj:

  • 该分配方式是基于Block memory allocator并且可以从内存池中分配不同大小空间的内存。分配的思路是基于balloc定义出来一块有一个个小元素组成的内存池,当需要分配自己需要大小的内存时,就从内存池里面把元素串接起来。这充分保证了内存的利用,但是会存在分配出来的内存是不连续的,并不能直接通过直接连续读取。如下图所示:
  • 所以该分配方式对内存空间利用率高,但是读取写入效率相比前两种来说会低一点

您可能还喜欢...