Lv_mem的探究

1 lv_mem 的作用

在 lv_conf 中可以看到LittlevGL的内存管理有两种方式,一种是使用 stdlib 标准库中的mallocfree,另外一种是使用LvGL内建的lv_mem_alloclv_mem_free。同时在LV_MEM_SIZE处定义使用的内存大小,如下所示定义为 128KB

2 效果

lv_mem 会根据定义的内存大小初始化一段内存空间,LittlevGL 中所有的数据将在这段内存空间上存储活动。

  • 如果事先没合理的考虑GUI使用内存的问题,在使用过程中很可能会出现内存溢出的问题,导致在使用GUI中的某个控件或者切换页面时出现崩溃的现象
  • 一般如果定义的内存大小合理超过GUI正常使用所需要的内存需求时,一般都不会有问题。

3 实现过程

在 lv_mem 中首先建立一个内存头部信息的结构体,再将这个内存头部信息与申请的内存中的第一个字节的数据作为一个内存记录的结构体,如下所示:

定义工作内存空间,即按照在 lv_conf 中定义的大小

再初始化内存空间

下面是申请内存空间的函数,先判断申请的内存空间是否为4的倍数,不是的话,调整为大于申请的大小的4的倍数的空间。再用这个空间大小去调用ent_alloc()这个函数去进一步申请内存

下面是ent_alloc()函数,在传入内存记录和申请大小的参数后,先判断这个内存记录有没有被使用过,再判断记录的空间是否大于申请的空间,如果都满足条件的话会进一步调用ent_trunc()去申请内存,同时将这条内存记录标记为1即被使用了。

在下面这个函数中,再次进行了申请空间是否为4字节对齐的检查,然后判断申请的空间加上内存头信息的大小是否正好等于内存记录剩余空间的大小,是的话就申请空间为剩余空间大小。之后再判断如果剩余空间与申请的空间不相等的话(这个是建立在内存足够的情况下,也就是不相等的意思就是代表申请空间小于剩余空间,如果大于的情况就是直接溢出程序崩溃,)就新建一个内存记录用于下一次内存申请。

下面是内存释放的函数,先判断要释放的数据是否为空,不为空的话然后将这个数据的内存头信息标记为0即未使用,然后进行碎片整理。

下面还有个内存碎片整理的函数,但是LittlevGL中默认没有使用到

文章作者: Sirius65535
文章链接: http://sirius.ink/2018/03/19/lv_mem的探究/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sirius' Notes