鸿蒙Hi3861学习十一-Huawei LiteOS-M(内存池)

news/2024/7/21 11:50:34 标签: harmonyos, liteos, 内存池

一、简介

        LiteOS将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的。

        LiteOS内存管理模块管理系统的内存资源,包括:初始化分配释放

        不采用C标准库中的内存管理函数malloc和free的原因如下:

  1. 小型嵌入式设备的RAM不足,导致这些函数在有些情况下无法使用
  2. 内存管理的函数实现代码量可能非常大,占据了相当大的一块代码空间。
  3. 不安全,执行时间不确定。
  4. 容易产生碎片。这两个函数会使得连接器配置变得非常复杂。

        内存池是线程安全的固定大小的内存块。它的操作速度比动态分配的堆要快得多,而且不会受到碎片的影响。由于是线程安全的,所以,可以从中断中访问

        内存池可以看做是一个固定大小,且大小相同内存块的链表从池中分配内存,只是从列表中解除块链,并将控制权交给用户。释放内存到池,只是将块重新链到空闲链表中

         共享内存是线程间交换信息的基本模型之一。与使用消息队列相比,使用内存池交换数据可以在线程之间共享更复杂的对象

Memory Pool

二、特点

        内存管理模块通过对内存的释放、申请操作,来管理用户和OS对内存的使用。使内存的利用率和使用率达到最优,同时最大限度地解决系统的内存碎片问题。

        内存管理分为:静态内存管理和动态内存管理。

        静态内存管理:在静态内存池中分配用户初始化时预设(固定)大小的内存块

  •         优点:分配和释放效率高,静态内存池中无碎片
  •         缺点:只能申请到初始化预设的内存块,不能按需申请。

        动态内存:在动态内存池中分配用户指定大小的内存块

  •         优点:按需分配
  •         缺点:内存池可能会存在碎片

        注:小熊派目前使用的都是动态内存的方式。

三、API介绍

      osMemoryPoolNew

        函数功能:

        创建内存池不能在中断中调用。

        函数原型:

osMemoryPoolId_t osMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr);

        参数:

        block_count:申请的内存块个数

        block_size:每个内存块的大小

        attr:属性。自定义内存时使用,默认为NULL

        返回值:

        NULL:失败

        其他值:内存池ID

        实例:

osMemoryPoolId_t mpid_MemPool = NULL;
mpid_MemPool = osMemoryPoolNew(MEMPOOL_OBJECTS,sizeof(MEM_BLOCK_t),NULL);

      osMemoryPoolAlloc

        函数功能:

        从内存池申请内存块。如果内存池空,则挂起,直到有内存块可用。如果超时时间为0,可在中断中调用

        函数原型:

void *osMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout);

        参数:

        mp_id:内存池ID。创建内存池osMemoryPoolNew时获得。

        timeout:等待超时时间

        返回值:

        获取到的内存块地址

        实例:

MEM_BLOCK_t *pMem = NULL;
osMemoryPoolId_t mpid_MemPool = NULL;

pMem = osMemoryPoolAlloc(mpid_MemPool,100);

      osMemoryPoolFree

        函数功能:

        释放内存块到内存池中。可在中断中调用

        函数原型:

osStatus_t osMemoryPoolFree (osMemoryPoolId_t mp_id, void *block);

        参数:

        mp_id:内存池ID。创建内存池osMemoryPoolNew时获得

        block:要释放的内存块地址。osMemoryPoolAlloc的返回值

        返回值:

        osOK:成功、

        其他值:失败

        实例:

osMemoryPoolId_t mpid_MemPool = NULL;
MEM_BLOCK_t *pMem = NULL;
osStatus_t rst = osMemoryPoolFree(mpid_MemPool,pMem);

      osMemoryPoolDelete

        函数功能:

        删除内存池不能在中断中使用

        函数原型:

osStatus_t osMemoryPoolDelete (osMemoryPoolId_t mp_id);

        参数:

        mp_id:内存池ID。创建内存池osMemoryPoolNew时获得。

        返回值:

        osOK:成功、

        其他值:失败

        实例:

osMemoryPoolId_t mpid_MemPool = NULL;
osStatus_t ret = osMemoryPoolDelete(mpid_MemPool);

四、实例

        待补充。


http://www.niftyadmin.cn/n/310510.html

相关文章

delete方法删除对象数组中元素导致原始数据被修改

记录一个自己在码代码过程中遇到的问题。 要求:删除数组对象中每一组对象中的一个属性。 下面是我原始的写法(当然是错误的)。 const { log } require("console");// 用于测试delete方法,删除对象中的指定元素 const testForDelete () >…

案例分享:ChatGPT写python脚本,轻松文本处理

大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加:keeepdance,备注:chatgpt,拉你进群。 在工作中,需要对数据进行筛选、分割和整理,当你接受到一个长长…

ConcurrentHashMap进阶面试题

ConcurrentHashMap 1.8的优化 存储的时候的优化写数据的时候加锁的优化扩容时的优化,有一个协助扩容的概念计数器的优化,在记录元素个数时,使用的类似与longAdder的形式,不会过度消耗CPU资源 为什么多线程情况下longAdder会比ato…

ChatGPT插件推荐,效率提升100倍!

在浏览器上使用ChatGPT时,借助一些插件可以帮助我们更便捷的获取消息,比如: 在搜索引擎搜索东西的同时和ChatGPT对话; 同一个问题同时向ChatGPT、newBing、Claude 等多个模型提问获取结果; 让ChatGPT可以联网获取最新…

五步看平台,选好安全的MT4交易外汇平台

在选择MT4外汇交易平台时,如何避免不正规的平台?以下是5招教你远离不正规MT4交易外汇平台。 1. 查看平台是否取得合法许可证 首要考虑的是该平台是否取得了合法的许可证。许可证是证明一个交易平台合法的最重要证据,因此务必在选择时核查该平台的许可证…

常用端口号/etc/services

/etc/services文件存储的内容。记录一下,防止忘记。 # /etc/services: # $Id: services,v 1.1 2004/10/09 02:49:18 andersen Exp $ # # Network services, Internet style # # Note that it is presently the policy of IANA to assign a single well-known # por…

Go语言零基础到进阶学习路线

Go语言零基础到进阶学习路线 一、基础二、进阶三、项目四、资源汇总五、面试题六、值得学习的开源项目七、本文思路 一、基础 Go语言基础教程:https://www.fdevops.com/docs/golang-tutorial/why刘丹冰Aceld 的入门视频:https://www.bilibili.com/video…

第五十三章 Unity 移动平台输入(上)

在移动设备上,Input 类提供对触摸屏、加速度计和地理/位置输入的访问。这里我们简单介绍Input类对于触摸屏的支持。Input.Touches是一个触摸数组,每个数组元素代表着手指在屏幕上的触碰状态Input.Touch。Input.Touch 数据结构表示: fingerId…