文章目录

  • 一、前言
  • 二、实验目的
  • 三、API
    • 3.1、osMemoryPoolAttr_t
    • 3.2、osMemoryPoolNew
    • 3.3、osMemoryPoolAlloc
    • 3.4、osMemoryPoolFree
  • 四、代码
    • 4.1、main.h
    • 4.2、main.c
  • 五、Event Recorder调试
    • 5.1、RTX RTOS

一、前言


内存池(Memory Pools)是线程安全的,固定大小的内存块。它们比动态堆栈分配内存操作更加快,且没有内存碎片化问题。因为线程安全,它们能够被线程与ISR同样地访问。

一个内存池能看被作为有效的(未使用的)内存块的链表,且它们有固定且相同的大小。从一个内存池里分配内存块提供给用户使用的话使用osMemoryPoolAlloc。使用osMemoryPoolFree将用户的内存块重新归还给内存池(此时用户不能再使用这块内存)。

共享内存是线程间交换信息的一个基本模型。使用内存池交换数据,相比于消息队列,内存池可以交换更为复杂的数据,且交换数据的效率更高。

什么是线程安全,网上有人总结得不错。简单来说,线程安全意味着一个方法或者一个实例(内存池,消息队列,信号量,互斥量等)可以被多个线程同时使用且没有问题发生。

STM32工程:
链接:https://pan.baidu.com/s/1jgNaS6A0CuId6_GiILg5hw
提取码:gie0

二、实验目的


1、建立一个内存池,并分配内存块0给用户使用。一段时间后,将内存块0归还给RTX5系统。

三、API


3.1、osMemoryPoolAttr_t

/* 使用案例1 */
const osMemoryPoolAttr_t memory_Poool_Attr =
{.name = "memory pool 1",                   /* 内存池的名字 */
};

3.2、osMemoryPoolNew

/* 使用案例1 *//* 定义内存块的数据结构 */
typedef struct {uint8_t buf[32];uint8_t Idx;}MEM_BLOCK_t;/* 创建一个内存池 */
mpID_MemPool = osMemoryPoolNew(16,                 /* 内存池里内存块的数量 */sizeof(MEM_BLOCK_t), /* 内存块的大小 */&memory_Poool_Attr   /* 内存块的属性 */);
if(NULL == mpID_MemPool)
{printf("Memory pool can't be created.\r\n");
}
else
{printf("Memory pool has been created.\r\n");
}

3.3、osMemoryPoolAlloc

/* 使用案例1 */
pMem = (MEM_BLOCK_t *)osMemoryPoolAlloc(mpID_MemPool,0U);  /* 从内存池里分配内存块0给用户使用*/
if(pMem != NULL)
{/* 获取内存块0成功,并初始化内存块0 */pMem->buf[0] = 100;pMem->Idx = 0;
}/* 使用案例2 */
pMem = (MEM_BLOCK_t *)osMemoryPoolAlloc(mpID_MemPool,10U);  /* 从内存池里分配内存块10给用户使用*/
if(pMem != NULL)
{/* 获取内存块0成功,并初始化内存块0 */pMem->buf[0] = 100;pMem->Idx = 10;
}

3.4、osMemoryPoolFree

/* 使用案例1 */
osStatus_t status;
status = osMemoryPoolFree(mpID_MemPool,pMem);  /* 将内存池的内存块0归还给RTX5,此时用户不能再使用内存块0 */
if(status == osOK)printf("Memory block 0 back to the System.\r\n");  /* 打印信息 */

四、代码


4.1、main.h

4.2、main.c





五、Event Recorder调试


5.1、RTX RTOS

程序初始化后,创建内存池memory pool 1,接着将内存池的内存块0分配给用户使用。从RTX RTOS窗口看到,此时的Used blocks为1。此外,还能了解到内存池的指针地址是0x200008C0。

一段时间后,将内存块0归还给RTX5系统(从printf信息看到)。此时,RTX RTOS的窗口看到,Used bloacks从1变成0了。

RTX5 | 内存池01 - 内存池的使用相关推荐

  1. Java多线程系列 JUC线程池01 线程池框架

    转载  http://www.cnblogs.com/skywang12345/p/3509903.html 为什么引入Executor线程池框架 new Thread()的缺点 1. 每次new T ...

  2. nginx内存占用高---内存池使用思考

    nginx内存占用高-内存池使用思考 问题现象 nginx top 进程 虚拟内存 200G 实际内存5G 和 CDN 平台相比要高很多 排查思路 使用pmap -p 进程号,发现从系统角度确实 有分 ...

  3. nginx的内存池及内存管理

    nginx对内存的管理是由自己实现的内存池结构ngx_pool_t来完成,本文主要讲nginx的内存管理. nginx对内存管理涉及到四个文件:src/core/ngx_palloc.h.src/co ...

  4. 3.内存分配、逃逸分析与栈上分配、直接内存和运行时常量池、基本类型的包装类和常量池、TLAB、可达性分析算法(学习笔记)

    3.JVM内存分配 3.1.内存分配概述 3.2.内存分配–Eden区域 3.3.内存分配–大对象直接进老年代 3.3.1.背景 3.3.2.解析 3.4.内存分配–长期存活的对象进去老年代 3.5. ...

  5. java 常量 内存分配_Java内存分配之堆、栈和常量池

    寄存器:最快的存储区,位于不同于其他存储区的地方--处理器内部.寄存器的数量极其有限,所以寄存器由编译器根据需求 进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. 栈:存放基本类型 ...

  6. java构建内存池队列_池化技术(线程池、连接池、内存池等)

    一.池化技术 - 简单点来说,就是提前保存大量的资源,以备不时之需. 对于线程,内存,oracle的连接对象等等,这些都是资源,程序中当你创建一个线程或者在堆上申请一块内存时,都涉及到很多系统调用,也 ...

  7. bytebuf池_PooledByteBuf内存池-------这个我现在不太懂

    转载自:http://blog.csdn.net/youaremoon/article/details/47910971 http://blog.csdn.net/youaremoon/article ...

  8. oracle共享池的结构,Oracle 10g内存结构之共享池的相关知识及使用简介

    Oracle 10g内存结构之共享池的相关知识及使用简介 之前我们介绍了:Oracle 10g内存结构之系统全局区简介,本文我们接着介绍一下Oracle 10g内存结构之共享池的相关知识,接下来就让我 ...

  9. Wireshark----wmem 内存池、内存管理的学习--README.wmem 翻译

    1. 什么是内存池? 当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低.内存池的概念就是预先在内存中申请一定数量的,大小相等 的内存块留作备用,当有新的内存 ...

最新文章

  1. Sql中的递归问题-思考与建议
  2. XAML数据绑定(Data Binding)
  3. LINQ系列:LINQ to SQL Join连接
  4. linux安装RabbitMQ和amqp扩展(这个安装rabbitmq通过了但是代码测试没有通过)
  5. FFmpeg 4.0版发布
  6. Android NFC 标签 读写
  7. mac 编译mysql 源码_Mac上编译MySQL源码与安装
  8. 电脑同时上内外网——设置教程(附内外网优先级设置)
  9. 微软Win10最新补丁KB5017380更新了什么?
  10. 阿里云服务器怎么购买才更划算(新手教程)
  11. Flutter 2.8 release 发布,快来看看新特性吧
  12. 使用Python仿真波的叠加
  13. linux进入桌面后CPU狂转,笔记本风扇狂转+CPU调节问题
  14. 面试常见问题之网络基础
  15. android recovery 和reboot
  16. python——田字格
  17. ABP文档 - 本地化
  18. oracle 控制文件 dump,将控制文件dump出来研究下内容
  19. Naxx Central District 1 Ice dragon saffron
  20. 网易云音乐VS腾讯音乐,1.0和2.0的交锋

热门文章

  1. 【12】Python函数学习(中)
  2. 给一个正在运行的Docker容器动态添加Volume
  3. Linux/unix不同shell环境下数值运算的处理
  4. Equals和==的差别
  5. Thinking In Java 读书笔记
  6. 总结————AJAX应用的五个步骤:
  7. 【下载中心】如何撰写分卷资源的标题、简介
  8. 学弟学妹看过来,小白到大神必经之路!
  9. 为什么需要python?它在人工智能与机器学习的优势是什么?
  10. 表妹好奇地问的飞鸽传书