内存管理

uC/OS-III可以获得连续的内存块。内存块大小可以相同, 所有的内存分

区包含了整数个内存块。 在特定的时间执行内存块的分配和释放。内存分

区以内存块数组的形式被静态分配的。如果分配后不被释放,也可以调用

malloc()动态分配。

不要在嵌入式系统中使用malloc()和free(),因为这样会导致内存碎片。

可以同时有多个内存分区且每个分区的内存块个数和大小可以不同,

根据需求设置, 但内存块被分配后必须返回给它所在的内存分区。

这种管理方式仅会导致内存块块内的碎片, 决定于应用中所设置内存块的大小。

1.创建一个内存分区

在使用内存分区之前必须创建它。这样uC/OS-III就可以知道这个内
存分区的相关信息并管理他们。调用OSMemCreate()创建一个内存分区。

( 1) 当创建一个内存分区时, 内存控制块(OS_MEM)的地址需作为参数被提供。 通常内存控制块从静态内存中分配,

然而, 也可以调用malloc()从堆中获得。用户代码不能释放内存控制块。

( 2) OSMemCreate()将内存块链接起来并将其链表的首地址赋值给OS_MEM结构体。

( 3)每个内存块的大小必须大于一个指针。

2.获得内存分区中的内存块

应用代码通过调用OSMemGet()可以从内存分区中申请内存块。

3. 归还内存块给内存分区

当用户对内存块的使用完毕后,必须将该内存块归还给对应的内
存分区。调用OSMemPut()实现这个功能。

4 .使用内存分区

编译时设置OS_CFG.H中的OS_CFG_MEM_EN为1开启内存管理服务。

函数名 功能
OSMemCreate() 创建一个内存分区
OSMemGet() 从内存分区中获得一个内存块
OSMemPut() 归还一个内存块给相应的内存分区

OSMemCreate()只能在任务级被调用,但是OSMemGet()和OSMemPut()可以在ISR中被调用。

5.列表显示了如何动态地分配内存。 在这个例子中, 左边任务读取模拟输入值(可以是压力、温度、电压),

并发送消息给右边任 务,消息中包含了根据模拟输入所计算出的相关信息的地址。在这个例子中错误的处理被集

中在右边任务中。其它任务或ISR也可以发送消息给该错误处理任务。

( 1) 任务读取模拟输入。 如果测得模拟输入超范围, 就发送消息给错误处理函数。

( 2)任务从内存分区中申请一个内存块用于存放检测模拟输入所得的相关数据。

( 3)任务将检测模拟输入所得的相关数据存入内存块。然而,没必要在内存块中存放时间戳因为时间戳被存放在消息中。

( 4) 任务提交消息给错误处理任务。 当然, 错误处理任务知道消息中所包含的数据的含义。 一旦消息被发送, 发送者任务不能再访

问消息所指向的内存块。

( 5)错误处理任务通常在消息队列中等待。
( 6)错误处理任务接收到消息后,执行相应的操作。
( 7) 错误处理任务处理完毕相应的操作后, 将内存块归还给对应的内存分区。 因此, 发送者和接收者都必须知道内存块是属于哪个

内存分区的,或者发送者可以将内存分区的地址作为要发送消息的数据中的一部分。 这样, 错误处理函数就知道将这个内存块归还给哪个

内存分区了。

6.任务在内存分区被分配完时可以等待内存块。 uC/OS-III不支持任务等待内存分区,但是可以通过一个信号量

用于内存分区中内存块的分配。

 (1)获得一个内存块时, 先调用OSSemPend()获得一个信号量,然后再调用OSMemGet()获得一个内存块。

( 2)释放一个内存块时, 先调用OSMemPut()释放这个内存块,然后再调用OSSemPost()释放这个信号量。

上面的操作必须以这个顺序执行。

用户可以在ISR中使用OSMemGet()和OSMemPut(), 因为这两个函数不会被阻塞且能快速地被执行。

(不能在ISR中调用会引起阻塞的函数)。

结语:

不要在嵌入式系统中使用malloc()和free(),因为这样会导致内存碎片。

可以用malloc()动态的分配内存空间,但不要释放这些内存空间。{就是说定义不需要释放的空间时可以

使用malloc(),这样能使所定义的空间的利用率接近为100%} 。

用户可以创建任意个内存分区(限制于处理器的RAM)。
uC/OS-III中与内存分区相关的函数都是以OSMem???()为前缀。

通过设置OS_CFG.H中的OS_CFG_MEM_EN为1开启内存管理服务。

19.0-uC/OS-III内存管理的更多相关文章

  1. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  2. OS之内存管理 --- 虚拟内存管理(二)

    关于虚拟内存管理之前的请看:OS之内存管理 - 虚拟内存管理(一) 帧分配 每个进程对的最小帧数是由操作系统的体系结构决定的,但是最大帧数是由可用物理内存的数量决定的.所以在这之间,对于进程的帧的分配 ...

  3. 【0 - 1】OC内存管理

    一.内存管理概述 垃圾回收机制(GC):由系统管理内存,程序员不需要管理. OC中的垃圾回收:在OC2.0版加入垃圾回收. OC与iOS:OC有垃圾回收机制,但是iOS屏蔽了这个功能.原因:iOS运行 ...

  4. OS之内存管理 --- 虚拟内存管理(一)

    虚拟内存的背景 在基本的内存管理策略中,所有的策略的相同点都是:每个进程在执行之前需要完全处于内存中.那有没有一种方法可以不需要将进程所有页面加载到内存中就可以开始运行进程呢?有没有可能在进程需要某些 ...

  5. OS之内存管理 ---基本的内存管理策略(二)

    分段 基本方法 分段就是基于用户视图的内存管理方案.逻辑地址空间是由一组段构成的,每个段都有名称和长度.地址指定了段名称和段内偏移.因此用户通过两个量来指定地址:段名称和段偏移. 为了简单,进行对段的 ...

  6. OS之内存管理 ---基本的内存管理策略(一)

    基本概念 基本硬件 CPU可以直接访问的通用存储只有内存和处理器的内置的寄存器.机器指令可以用内存地址作为参数,而不能用磁盘地址作为参数.所以执行指令以及指令使用的数据,应在这些可执行访问的存储设备上 ...

  7. oranges-给mini os 添加内存管理,进程多级反馈队列,进程内存完整性度量

    参考: 内存管理: https://www.jianshu.com/p/49cbaccd38c5 crc校验 https://www.cnblogs.com/zzdbullet/p/9580502.h ...

  8. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  9. 19.1-uC/OS-III内存管理应用

    一个处理器,在不断地分配和释放内存的过程中,一整块连续的内存被分散为很多离散的小块内存, 这些叫做内存碎片, 内存碎片过多会导致内存的浪费. uC/OS 的内存管理机制就是为了尽量减少内存碎片.大致的 ...

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

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

随机推荐

  1. CZT变换(chirp z-transform)

    作者:桂. 时间:2018-05-20  12:04:24 链接:http://www.cnblogs.com/xingshansi/p/9063131.html 前言 相比DFT,CZT是完成频谱细 ...

  2. Java基础(二)面向对象(上)

    面向对象基础知识 面向对象是相对面向过程而言的 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象 面向对象是基于面向过程的 面向对象的特征: 封 ...

  3. LeeCX - 开源后台管理系统简单介绍

    我们在github上开源了一个后台管理系统,使用了前端css框架并且简单的封装了一下,技术的将会不间断更新,详细可以点击原文链接.具体介绍如下: LeeCX 开源后台管理系统,前端基于bootstra ...

  4. css世界的学习笔记

    1.+选择器div+p:选择紧接在div后的所有p元素: 2.导航的样式:(注意:不给a设置width:100%;只是需要display:block;利用流布居:) <h4>无宽度,借助流 ...

  5. 【宣讲】德州科技职业学院宣讲关于IT领域趋势分析

    12月25日,AICODER马伦老师受德州科技职业学院校领导的邀请,到德州科技职业学院青岛校区洽谈新型的校区合作,创新现有的职业教育的传统模式的束缚,探索新型的职业教育直接跟企业实习实战结合的新型职业 ...

  6. [转]Mybatis foreach 批量操作

    原文地址:https://blog.csdn.net/jason5186/article/details/40896043 foreach属性属性    描述item    循环体中的具体对象.支持属 ...

  7. 你真的理解Python中MRO算法吗?[转]

    [前言] MRO(Method Resolution Order):方法解析顺序.Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多问题,比如二义性,Python中 ...

  8. 微信OAuth2.0网页授权设置一个域名需多个域名使用的问题

    最近遇到一个问题,一个微信公众号,需要在多个域名上使用OAuth2.0网页授权,但微信OAuth2.0网页授权回调域名只能设置一个. 解决办法: 通过多一次的跳转,解决了微信限制回调域名只能设置一个的 ...

  9. VMware vCenter Server 6.5配置群集功能

    虚拟数据中心是一种容器,其中包含用于操作虚拟机的完整功能环境所需要的全部清单对象.可以创建多个数据中心,以实际需求创建 . 群集是一组主机,将主机添加到群集时,主机的资源将成为群集资源的一部分,群集管 ...

  10. Hive学习笔记——安装和内部表CRUD

    1.首先需要安装Hadoop和Hive 安装的时候参考 http://blog.csdn.net/jdplus/article/details/46493553 安装的版本是apache-hive-2 ...