OS_MEM   *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)   {

..............................................

plink = (void **)addr;    /* Create linked list of free memory blocks当上述条件都得到满足时,所要建立的内存分区内的所有内存块链接成一个单向链表。这里之所以用单向链表,是因为在单向链表中插入和删除元素都是从链表的 顶端开始向下执行的。内存区可使用静态二维数组或者在初始化时使用malloc()建立,因为malloc()返回值为void*所以这里是 (void **)addr;其实此时plink里面存放的也是当前内存块的地址*/

pblk   = (INT8U *)addr + blksize; /*pblk指向将被释放的内存控制块的指针。如果在此处不是很理解,请参看谭浩强C语言的多维数组与指针一节。其实此时pblk就是链表的下一个内存块的地址*/

for (i = 0; i < (nblks - 1); i++) {               /*这里也体现了nblk应该大于等于2*/

*plink = (void *)pblk;  /*在plink所指向的地址内存入指针pblk,这样此时这个plink指向的单元的头

四个字节中存入了链表的下一个内存块的地址。*/

plink   = (void **)pblk;    /* plink和pblk指向同一地址    (void **)pblk 这样转换了类型 但是pblk的

值并不改变,于是这样把pblk的值赋给了plink*/

pblk    = pblk + blksize;   /*指针pblk指向地址(plbk + blksize);这一段程序建立了一个内存分区,该内

存分区由nblks个大小为blksize的内存块组成.所有的内存块以单联表的形式连接在一起。单联表的指针域在每个内存块的头四个 字节内(一个指针占用四个字节).注意一个指针的大小决定于所用编译器 TC运行在16位模拟器中所以指针大小是16位即2字节   而 现在大多数编译器运行在32位模拟器中所以指针大小是32位即4字节。

}

.................................................................

}

c语言不够扎实,这是网上找的解说,看了好久貌似懂了。

其实就是 把pblk(一个地址)看成一个数,然后强制类型转换后赋给相应一级和二级指针,这样就形成了链表

void   *OSMemGet (OS_MEM *pmem, INT8U *err)         /*传递给OSMemGet()函数的参数中的指针pmem,它指向希望从中非配到内存块 的内存分区。*/

{

................................

if (pmem->OSMemNFree > 0) {    /* See if there are any free memory blocks;OSMemGet()要检查内存分区中是否有空余的内存块。*/

pblk    = pmem->OSMemFreeList;    /* Yes, point to next free memory block如果有空余内存块,那么其中第 1个内存块会从空余内存块链表中被删除*/

pmem->OSMemFreeList = *(void **)pblk;      /*       Adjust pointer to new free list此处为什么要用*(void **)pblk 的形式 网上众说纷纭,其实我觉的很简单,因为OSMemFreeList在定义的时候就定义成了void* 见UCOS_II.H文件 这里纯粹就是 为了统一类型作的强制转换类型而已,是一种编程的好习惯。当然还是应该格外注意void*的用法。*/

pmem->OSMemNFree--;    /*       One less memory block in this partition空余内存块链表会被更新,包括将链表头指针后移一个元素和将空余内存块数减一。*/

OS_EXIT_CRITICAL();

*err = OS_NO_ERR;

return (pblk);   /*    Return memory block to caller将指向已分配的内存块的指针返回给用户程序。*/

}

....................................

}

第一句:pmem->OSMemFreeList也指向空闲链表的起始地址,把这个起始赋给pblk

第二句:即把pmem->OSMemFreeList(也即pblk)指向的地址中的内容(即下一内存块的地址)赋给pmem->OSMemFreeList

难点就是 要搞清 地址 和地址中存的内容,即二级指针方面

转载于:https://www.cnblogs.com/hzhida/archive/2012/03/30/2425169.html

uc/os内存管理的理解相关推荐

  1. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

  2. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Aut ...

  3. Symbian OS内存管理介绍

    Symbian OS内存管理介绍 在Symbain OS中内存管理的主要任务是:如何为程序分配内存以及如何在程序的内部分配内存. Symbian OS 程序最根本和基础的东西就是内存,作为一个有限的资 ...

  4. ios 内存管理的理解(一) 简述

    1. 内存管理的范围 所有的OC对象(继承自NSObject类) 本质原因:是因为对象和其他数据类型在系统中的存储空间不一样,其他局部变量主要存放于栈中,而对象存储于堆中. 当代码块结束时,这个代码块 ...

  5. ios 内存管理的理解(三)ARC下 对象内存管理

    1 ARC工作原理详述 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease 2 ...

  6. ios 内存管理的理解(二)ARC概念及原理

    1.什么是ARC? Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化.ARC是新的LLVM 3. ...

  7. ios 内存管理的理解(五)ARC使用特点及注意事项

    1 ARC使用特点及注意事项 不允许调用release,retain,retainCount 允许重写dealloc方法,但是不允许调用[super dealloc] 2 ARC使用注意事项 ARC中 ...

  8. ios 内存管理的理解(四)ARC下循环引用问题

    案例 一个人拥有一只狗,一只狗拥有一个主人. @interface Person :NSObject@property(nonatomic,strong) Dog* dog; @end @interf ...

  9. Cu 大彻大悟内存管理 mm (update 0410)

    66 2012-4-10 11:23:53 一口气读完,畅快..原来站在设计者的角度是这样的   来源于cu 讨论 创意 ARM在内存管理上,和x86的区别主要是页表构造不同. 除了用层的思想,用映射 ...

最新文章

  1. 技术图文:集合技术在求解算法题中的应用
  2. 中的count函数_关于计数的5个函数都不掌握,那就真的Out了!
  3. 木马——本质就是cs socket远程控制,反弹木马是作为c端向外发起网络请求
  4. mysql 高级语法,SQL 语法高级
  5. php windows 操作文件,Windows开启审核功能来记录文件删除操作的详解
  6. IOS开发基础之NSURLSession的使用
  7. 家用计算机历史记录,教您如何查看电脑使用记录
  8. python博客源码下载_Python生成并下载文件后端代码实例
  9. ROS学习笔记12(用Python写一个简单的消息发布和消息订阅)
  10. 怎样完整的转换PDF格式文件
  11. 大数据之Hadoop3.x模板虚拟机配置图解
  12. 计算机发展趋势 五笔型码,计算机五笔识别码字有哪些
  13. 崩溃!因对领导不满前网管离职后远程入侵服务器,致诊疗系统瘫痪!
  14. 用vector实现通用堆栈的类模板
  15. Linux文件颜色与文件类型对应(白色、蓝色、红色、黄色、绿色 代表的意义。。。)
  16. mysql表情符存储设置
  17. 1024程序员节开幕,龙蜥多位技术专家参与演讲
  18. 解决@Autowired警告
  19. 《罗马革命》豆瓣 9.1 从恺撒大帝到屋大维
  20. select标签默认选项

热门文章

  1. 企业网络推广——企业网络推广公司解读企业新站沙盒期如何优化?
  2. oracle dbms refresh,oracle 10g中dbms_mview.refresh()函数
  3. 二元偏导数存在的条件_高等数学入门——高阶偏导数的概念和计算
  4. centos 安装搜狗输入法_Ubuntu 20.04 安装搜狗输入法
  5. c语言getitem函数,该借用和窃取的引用的Python C-API函数
  6. excel乘法公式怎么输入_Excel函数中的IF条件函数怎么用?四个IF函数公式带你轻松上手...
  7. 十步完全理解 SQL
  8. 从0开始学Java——@override的作用
  9. vi编辑器简单应用(摘抄)
  10. 如何隐藏sql2000系统表