rt-thread内存管理.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
rt-thread内存管理

RT-THREAD内存管理 RT-THREAD对于内存管理主要有2种方法:静态内存池管理和动态内存管理。 静态内存池管理 在物理内存中划出一块连续区域作为内存池,将其划分成若干大小相同的内存块,并把这些小内存块用链表连接起来。内核通过链表分配内存块进行内存管理,可以极大加快内存分配、释放过程。内存池一旦创建,它的大小及其内部内存块大小都已经固定不能随便调整。 在RT-Thread内核中内存池对象rt_mempool用来记录内存池的基本信息,它是内核对象的子类,主要保存内存池起始地址、内存块大小、内存块块数、内存块链表以及等待线程队列等。 struct rt_mempool { struct rt_object parent; /** inherit from rt_object */ void *start_address; /** memory pool start */ rt_size_t size; /** size of memory pool */ rt_size_t block_size; /** size of memory blocks*/ rt_uint8_t *block_list; /** memory blocks list*/ rt_size_t block_total_count; /** numbers of memory block*/ rt_size_t block_free_count; /** numbers of free memory block */ rt_list_t suspend_thread; /** threads pended on this resource*/ rt_size_t suspend_thread_count;/** numbers of thread pended on this resource */ }; 对于内存池的操作主要有内存池的初始化、脱离内核对象管理、创建和删除内存池、分配和释放内存池等操作。其中内存池初始化用于静态内核对象,而内存池的创建用于动态内核对象。 1、内存池初始化 初始化内存池接口: rt_err_t rt_mp_init(struct rt_mempool* mp, const char* name, void *start, rt_size_t size, rt_size_t block_size) 对于线程申请的静态对象,内存池对象的内存起始地址、内存池大小、内存块大小都是由用户指定。将此内存池对象加入内核对象管理体系中后初始化内存池对象的各个元素。之后内核对该指定的内存池划分为若干大小为block_size的内存块,并将其组织成为用于分配的空闲块链表。(初始化后的内存池结构如图1所示) 2、内存池脱离 脱离内存池对象接口: rt_err_t rt_mp_detach(struct rt_mempool* mp) 这部分与静态内存池对象相对应,它将内存池对象从内核对象管理体系中删除。内核首先唤醒该内存池对象中的所有等待线程,再把此内存池对象删除。 3、内存池创建 创建内存池接口: rt_mp_t rt_mp_create(cons char*name,rt_size_t block_count, rt_size_t block_size) 创建一个内存池首先创建一个内存池对象并在内存堆中根据线程指定的块大小和块数量分配一块区域作为内存池,之后便初始化内存池对象结构,将分配的内存池组织成可供与分配的空闲块链表。 4、内存池删除 删除内存池接口: rt_mp_t rt_mp_create(const char* name, rt_size_t block_count, rt_size_t block_size) 与脱离内存池一样内核唤醒该内存池对象中所有挂起线程,再将此内存池所占有的内存释放到内存堆中,之后删除内存池对象。 5、内存块分配 分配内存块接口: void *rt_mp_alloc (rt_mp_t mp, rt_int32_t time) 内核在线程指定的内存池中分配给线程一个空闲内存块。首先判断内存池中是否有空闲内存块(mp-block_free_count),若有空闲内存块则从空闲内存块链表中取出下一个内存块并将内存池对象中的block_free_count减一。若没有空闲内存块那么判断等待时间是否为零,如果为零则立即返回RT_NULL即没有内存块;若等待时间大于零,把当前线程挂在该内存池对象的等待队列中,一直等待到内存池中有空闲内存块并分配给自己,或者等待时间到达自动退出。(分配后的内存池结构如图2所示) 6、内存块释放 释放内存块

文档评论(0)

75986597 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档