uC/OS-II 内存管理
UC/OS-II 内存管理
1. 简介
    uC/OS-II 不使用ANSI编译器的malloc(), free(),因为内存碎片,很可能获取不到一块连续的内存, 这在嵌入式系统中是很危险的。同时malloc()和free()的执行时间也是不确定的。
    uC/OS-II 把内存划分为固定长度的块,一定数量的块组成一个partition,分配和回收的函数的执行时间是固定的,即常量时间。
    可以有一个或多个分区(partition), 每个分区的块大小可以不一样,这样想获取不同size的块,就从不同的分区取。再者,从哪个分区获取的块,回收时要重新放回获取内存时的分区,即哪来哪去。
2. 数据结构
    内存控制块:用于跟踪内存分区,每个分区使用自己的内存控制块
 typedef struct {
        void *OSMemAddr;
        void *OSMemFreeList;
        INT32U OSMemBlkSize;
        INT32U OSMemNBlks;
        INT32U OSMemNFree;
 } OS_MEM;
OSMemAddr       : 内存分区的起始地址,分区建立时初始化,以后不再改变
   OSMemFreeList : 指针,两种用途:1.指向下一个空闲的内存控制块,2.指向下一个空闲的内存块,视情况定    ** 要注意区分内存控制块和内存块**
   OSMemBlkSize  : 分区中内存块的大小
   OSMemNBlks     : 分区内内存块总数,分区建立时指定
   OSMemNFree    : 内存块的可用数,就是还剩多少个块可以分配。
两个选项:(OS_CFG.H)
   OS_MEM_EN               1  允许初始化内存管理器
   OS_MAX_MEM_PART   4  内存分区数,至少是2
图:

这个链表由OSMemInit()建立,而OSMemInit()由OSInit()自动调用
3. 建立分区 
    分区要先初始化才能使用, 建立分区由OSMemCreate()完成:
OS_MEM OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err);
算法描述:
       1. nblks >=2, blksize > sizeof(void *), 否则报错,返回(OS_MEM *)0;   
       2. 从OSMemFreeList取下一个内存控制块。因为一个分区需要一个内存控制块。
           验证一下不是空指针
           ** OSMemFreeList 是个全局变量 **, 指向上面图中的内存控制块链表头
       3.  将内存块连接起来,形成分区
       4.  初始化2中取出的内存控制块
简单点说, 这个函数的功能就是把空闲的内存块连接起来形成分区,再将分区相关信息放入内存控制块。
    代码这里就不粘出来了。 函数执行后, 内存分区如图:
值得注意的是,这些内存块是通过每个块的前面几个字节作为连接地址的。这就是为什么blksize > sizeof(void *)
4. 获取内存块
    void * OSMemGet(OS_MEM *pmem, INT8U *err) ;
这个函数就是把内存控制块的OSMemFreeList所指向的内存块返回,然后OSMemFreeList(这个不是全局变量那个)指向下一个空闲内存块。
5. 返还内存块
    INT8U OSMemPut(OS_MEM *pmem, void * pblk);
用完了就返还内存块到链表里。 返还的位置还是OSMemFreeList.
6. 获取内存分区的状态
   INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);
状态用一个结构来表示:
typedef struct {
        void *OSAddr;        /* 分区的起始地址 */
        void *OSFreeList;    /* 空闲块的起始地址 */
        INT32U OSBlkSize;    /* 内存块的size */
        INT32U OSNBlks;      /* 分区里块的总数 */
        INT32U OSNFree;      /* 空闲块的数量 */
        INT32U OSNUsed;      /* 使用块的数量 */
} OS_MEM_DATA;
将内存控制块的各字段,赋给OS_MEM_DATA的各字段,很简单。
uC/OS-II 内存管理的更多相关文章
- uC/OS II原理分析及源码阅读(一)
		
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
 - 【原创】uC/OS II 任务切换原理
		
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
 - OS之内存管理 --- 虚拟内存管理(二)
		
关于虚拟内存管理之前的请看:OS之内存管理 - 虚拟内存管理(一) 帧分配 每个进程对的最小帧数是由操作系统的体系结构决定的,但是最大帧数是由可用物理内存的数量决定的.所以在这之间,对于进程的帧的分配 ...
 - 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
		
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
 - OS之内存管理 --- 虚拟内存管理(一)
		
虚拟内存的背景 在基本的内存管理策略中,所有的策略的相同点都是:每个进程在执行之前需要完全处于内存中.那有没有一种方法可以不需要将进程所有页面加载到内存中就可以开始运行进程呢?有没有可能在进程需要某些 ...
 - OS之内存管理 ---基本的内存管理策略(一)
		
基本概念 基本硬件 CPU可以直接访问的通用存储只有内存和处理器的内置的寄存器.机器指令可以用内存地址作为参数,而不能用磁盘地址作为参数.所以执行指令以及指令使用的数据,应在这些可执行访问的存储设备上 ...
 - OS之内存管理 ---基本的内存管理策略(二)
		
分段 基本方法 分段就是基于用户视图的内存管理方案.逻辑地址空间是由一组段构成的,每个段都有名称和长度.地址指定了段名称和段内偏移.因此用户通过两个量来指定地址:段名称和段偏移. 为了简单,进行对段的 ...
 - oranges-给mini os 添加内存管理,进程多级反馈队列,进程内存完整性度量
		
参考: 内存管理: https://www.jianshu.com/p/49cbaccd38c5 crc校验 https://www.cnblogs.com/zzdbullet/p/9580502.h ...
 - uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
		
1. OSTaskCreate() OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构. ...
 - 19.1-uC/OS-III内存管理应用
		
一个处理器,在不断地分配和释放内存的过程中,一整块连续的内存被分散为很多离散的小块内存, 这些叫做内存碎片, 内存碎片过多会导致内存的浪费. uC/OS 的内存管理机制就是为了尽量减少内存碎片.大致的 ...
 
随机推荐
- spring,springmvc,mybatis基本整合(一)--xml文件配置方式(1)
			
**这个整合.仅仅是最主要的整合,而且是xml配置文件的方式之中的一个,即当中的mybatis是採用非mapper接口的方式.(第二遍採用mapper接口方式.第三遍採用注解的方式:第四篇採用注解基于 ...
 - Android - include属性用法
			
include属性用法 本文地址: http://blog.csdn.net/caroline_wendy Android的layout中, 能够使用include属性样式, 这样能够把不同的layo ...
 - Android中相机和相冊使用分析
			
Android中相机和相冊使用分析 欢迎转载,但请尊重原创(文章来自不易,转载请标明转载出处,谢谢) 在手机应用程序中,使用自带的相机拍照以及相冊选择喜欢的图片是最常见只是的用户需求,那么怎么合理使用 ...
 - Android内核sysfs中switch类使用实例
			
Android内核sysfs中switch类使用实例 最终在这个周末,能够干点自己想要干的事了. 由我这个二流的内核驱动开发人员来解析一下sysfs中的switch类.先猜測一下来历,在普通的嵌入式L ...
 - 495A - Digital Counter
			
A. Digital Counter time limit per test 1 second memory limit per test 256 megabytes input standard i ...
 - 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
			
一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...
 - 腾讯Web工程师的前端书单
			
2014年一月以来,自己接触web前端开发已经两年多了,记录一下自己前端学习路上看过的,以及道听途说的一些书,基本上按照由浅入深来介绍. JavaScript 入门 <JavaScript权威指 ...
 - 【ASP.NET MVC】MVC概述
			
描述 本篇文章主要概述ASP.NET MVC,具体包括如下内容: 1.MVC模式概述 2.WebForm概述 3.WebForm与MVC区别 4.ASP.NET MVC发展历程 5.运用程序结构 6. ...
 - Bandit Wargame Level18 Writeup(interactive shell and .bashrc )
			
Bandit Level 18 → Level 19 Level Goal The password for the next level is stored in a file readme in ...
 - Java I/O---类体系总结
			
1.Java I/O常用 (1)File 对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. (2)FileInputStream 从文件系统中的某个文件中获得输入字节: ...