UCOSIII内存管理机制详解
目录
前言
1. 内存管理概述
2. 内存区域(存储区)和内存块
3. 存储区控制块(OS_MEM)
4. 内存管理函数
5. 内存碎片问题
6. 注意事项
7.代码实现
7.1创建内存区域
7.2申请内存
7.3释放内存
前言
UCOSIII(即Micrium μC/OS-III)的内存管理是其操作系统功能的一个重要组成部分,旨在高效地管理和分配系统内存资源。以下是对UCOSIII内存管理的详细介绍:
1. 内存管理概述
UCOSIII将内存管理分为不同的区域(或称为“区”)和块。每个区域包含多个固定大小的内存块,这些内存块用于满足应用程序的不同内存需求。
2. 内存区域(存储区)和内存块
- 内存区域(存储区):是一个连续的内存空间,被划分为多个固定大小的内存块。这些区域在程序中是固定的,通常通过数组来表示,例如
u8 buffer[20][10]
表示一个有20个存储块,每个存储块10字节的存储区。 - 内存块:是内存区域中的基本单位,具有固定的大小。应用程序可以根据需要申请和释放这些内存块。
3. 存储区控制块(OS_MEM)
UCOSIII使用OS_MEM
结构体来表示内存区域(存储区)的控制块。这个结构体包含了关于内存区域的重要信息,如内存区域的起始地址、名称、空闲块指针、块大小、最大块数和空闲块数等。
struct OS_MEM {OS_OBJ_TYPE Type; // 类型void *AddrPtr; // 指向存储区起始地址CPU_CHAR *NamePtr; // 指向存储区名字void *FreeListPtr; // 指向空闲存储块OS_MEM_SIZE BlkSize; // 存储块大小,单位:字节OS_MEM_QTY NbrMax; // 存储区中总的存储块数OS_MEM_QTY NbrFree; // 存储区中空闲存储块数// 可能还有其他用于调试的成员
};
4. 内存管理函数
UCOSIII提供了几个关键的内存管理函数,用于创建内存区域、申请和释放内存块:
- OSMemCreate():创建一个新的内存区域。这个函数需要指定内存区域的名称、基地址、块数量和块大小等参数。
- OSMemGet():从指定的内存区域中申请一个内存块。如果成功,该函数将返回一个指向内存块的指针;如果失败(例如,没有可用的内存块),则返回NULL。
- OSMemPut():将之前申请的内存块释放回其所属的内存区域。这个函数需要指定内存区域和要释放的内存块指针。
5. 内存碎片问题
在嵌入式系统中,频繁地分配和释放小块内存可能会导致内存碎片问题。UCOSIII通过提供固定大小的内存块来避免这种情况,因为每个内存块在释放时都会返回到其原始的内存区域中,从而减少了内存碎片的产生。
6. 注意事项
- 在使用UCOSIII的内存管理功能时,应确保遵守其API函数的调用规则和限制。
- 根据应用程序的内存需求,合理规划和分配内存区域和内存块。
- 注意内存碎片问题,并尽可能避免在嵌入式系统中使用
malloc()
和free()
等函数,因为它们可能会导致内存碎片的产生。
7.代码实现
7.1创建内存区域
//定义一个存储区
OS_MEM EXTERNAL_MEM;
//存储区中存储块数量
#define EXTRENNAL_MEM_NUM 5
//每个存储块大小
//由于一个指针变量占用4字节所以块的大小一定要为4的倍数
//而且必须大于一个指针变量(4字节)占用的空间,否则的话存储块创建不成功
#define EXTERNAL_MEMBLOCK_SIZE 100
//存储区的内存池,使用外部SRAM
__align(32) volatile CPU_INT08U External_RamMemp[EXTRENNAL_MEM_NUM][EXTERNAL_MEMBLOCK_SIZE] __attribute__((at(0XC0800000)));//创建一个存储分区OSMemCreate((OS_MEM* )&EXTERNAL_MEM,(CPU_CHAR* )"External Mem",(void* )&External_RamMemp[0][0],(OS_MEM_QTY )EXTRENNAL_MEM_NUM,(OS_MEM_SIZE)EXTERNAL_MEMBLOCK_SIZE,(OS_ERR* )&err);
7.2申请内存
typedef unsigned char CPU_INT08U; /* 8-bit unsigned integer */
static u8 external_memget_num;
CPU_INT08U *external_buf;
//申请内存
external_buf=OSMemGet((OS_MEM*)&EXTERNAL_MEM,(OS_ERR*)&err);
7.3释放内存
OSMemPut((OS_MEM* )&EXTERNAL_MEM, //释放内存(void* )external_buf,(OS_ERR* )&err);
相关文章:
UCOSIII内存管理机制详解
目录 前言 1. 内存管理概述 2. 内存区域(存储区)和内存块 3. 存储区控制块(OS_MEM) 4. 内存管理函数 5. 内存碎片问题 6. 注意事项 7.代码实现 7.1创建内存区域 7.2申请内存 7.3释放内存 前言 UCOSIII(即Mi…...
Android12 显示框架之Transaction----client端
目录:Android显示终极宝典 在前面的章节中,应用通过createSurface()在surfaceflinger中创建了一层layer,紧接着要做的事情就是对这个layer设置一些属性(或者叫状态),常设置的属性有位置、大小、z-order等等…...
在Windows上使用FRP搭建内网穿透:
FRP服务器端配置(公网服务器) 下载FRP: 访问FRP的GitHub发布页面:https://github.com/fatedier/frp/releases下载对应系统架构的frp_<version>_linux_amd64.tar.gz(如果你的服务器是Linux系统)或者f…...
TypeError: Cannot read properties of undefined (reading ‘scrollIntoView‘)(已解决)
问题复现:眨眼睛使用vitevue3实现跳转dom功能时使用了scrollIntoView方法,在打包上传以后使用该功能报错 小友可能会陷入误区,以为是函数方法有问题,毕竟在开发时是没有问题的, 而实际上呢问题出在获取节点失败了 在这…...
【解决】Unity Inspector 视窗脚本中文乱码问题
开发平台:Unity 2020 编程平台:Visual Studio 2022 问题描述 开发过程中,为便利化快速审阅代码内容,通过 Unity Inspector 确认代码内容与逻辑。但对于默认安装的 Visual Studio 编程平台,保存的 UTF- 8 脚本文件在…...
使用 C/C++访问 MySQL
目录 准备工作 尝试链接 MySQL Client MySQL 接口介绍 准备工作 保证 MySQL 服务有效。下载MySQL开发包(可以在MySQL官网下载安装也可以在软件源安装) MySQL 开发包通常会包含一些特定的头文件和库文件。您可以检查以下常见的路径: /us…...
Linux 网络套接字解析:实现网络通信
目录 一.网络基础1.协议2.OSI与TCP/IP模型3.网络通信流程4.IP与Mac地址 二.网络编程套接字1.端口号2.网络字节序3.tcp、udp协议4.socket编程5.sockaddr结构解析6.实现Udp_socket7.实现Windows与Linux通信8.Linux下远程执行指令9.实现tcp_socket10.守护进程 一.网络基础 1.协议…...
vue3 组合式API
<!-- 深度监听 deep 点击按钮控制台,才输出count变化了: 1, 老值: 0;否则控制台不输出 --> <script setup>import { ref,watch } from vueconst state ref({count:0})const setCount () > {state.count.value}watch(state, () > {console.log(…...
二、什么是Vue中的响应式?Vue的响应式原理
什么是Vue中的响应式 Vue中的响应式,简而言之就是当数据发生变化时,页面跟随变化。使用过Vue的v-model都有比较深刻的感受,我们在代码中修改双向绑定的数据后,页面上的数据也会自动更新,页面跟随变化 我们看个例子&am…...
快9月了才开始强化,跟张宇还是武忠祥?
快9月了才开始强化,跟张宇还是武忠祥! 说真的,我也替这位同学着急,但是考研数学越是进度慢,就越不能急!急着赶进度,容易出事!遇到这个问题的朋友肯定不止一位,那我就帮大…...
SSM好易学学习平台---附源码92142
摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设好易学学习平台。本文…...
对于mp4 ios和mac safari不能播放问题处理
直接对原mp4文件进行重新转码就可以了 ffmpeg -i origin.mp4 -vcodec h264 -profile:v high -level 4.1 orgin_hl.mp4 原因源文件不符合苹果基本规则 苹果官网文档...
开发同城交友找搭子系统app前景分析
开发同城交友系统APP的背景 社交需求多样化: 随着城市化的加速和人们生活节奏的加快,现代人的社交圈子往往较为狭窄,难以结识新朋友。传统的线下交友方式受限于时间、地点等因素,难以满足现代人对于交友的多样化需求。互联网和智…...
faiss向量数据库测试《三体》全集,这家国产AI加速卡,把性能提了7倍!
在人工智能和机器学习技术的飞速发展中,向量数据库在处理高维数据方面扮演着日益重要的角色。近年来,随着大型模型的流行,向量数据库技术也得到了进一步的发展和完善。 向量数据库为大型模型提供了一个高效的数据管理和检索平台,…...
负载均衡---相关概念介绍(一)
负载均衡(Load Balance)是集群技术的一种重要应用,旨在将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,从而提高系统的并发处理能力、增加吞吐量、加强网络处理能力,并提供故障转移以…...
计算机基础知识复习8.14
子线程抛异常主线程能否catch 在不做任何处理的情况下,主线程不能catch 解决方式: 子线程使用try catch来捕获异常 为线程设置未捕获异常处理器UncaughtExceptionHandler 通过future的get方法捕获异常 JVM相关参数 显示指定堆内存-Xms和-Xmx指定最…...
【io深层理解】
io深层理解 1.内核态2.用户态3. select IO多路复用执行原理4. select io多路复用限制和不足 1.内核态 一个进程会涉及多文件的修改,比如说。那么在内核态就会维护一个表,这个表叫文件描述符bitmap,这个表会传递给内核态,当然肯定传…...
【懒人工具】指定新文件,替换全盘旧文件
没辙,就是懒 最近在调整.clang-format,这个format文件要跟着项目走,只换本地默认的还不够。调整好以后一个项目一个项目的换,有时候会漏掉,索性全盘一次性换完。 基于自己操作的流程,写了个脚本࿰…...
React+Vis.js(02):设置节点样式
文章目录 1、修改vis.js的节点和关系颜色2、修改vis.js节点的字体颜色2.1 统一设置节点字体颜色2.2 自定义某个节点的字体颜色3、设置vis.js节点的边框颜色和宽度3.1 设置单个节点3.2 统一设置1、修改vis.js的节点和关系颜色 在vis.js中,可以通过color属性,来给node节点添加…...
3G网络要彻底没了
2月21日,三大运营商公布了最新的用户数据,移动联通电信三家5G套餐用户数合计超过了7.5亿。信通院早前公布的数据显示,一月份,国内市场5G手机出货量2632.4万部,占同期手机出货量的79.7%。 这两项数据,说明我们已经进入到了5G时代,5G的普及速度远超很多人的想象。就在5G逐…...
如何配置ESXI主机的IP地址管理
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…...
软件测试学习笔记丨测试用例设计方法
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/31921 一,黑盒测试方法论 1,等价类 1.1 定义 等价类划分是一种重要的、常用的黑盒测试方法不需要考虑程序的内部结构,只需要考虑程序的输入规格即可它将…...
MinIO基本用法
在现代云计算和大数据领域,对象存储因其可扩展性、可靠性和低成本成为数据存储的重要选择。MinIO作为一个高性能、分布式的对象存储系统,凭借其开源、简单易用以及与Amazon S3兼容的特性,在业界得到了广泛的应用。本文将带您了解MinIO的基本用…...
MySQL windows版本安装
一、下载MySQL安装包 访问MySQL官网:首先,访问MySQL的官方网站(MySQL),或者更具体地,访问MySQL的下载页面(MySQL :: Download MySQL Community Server)。 选择适合的版本࿱…...
Python实现人脸轮廓提取
目录 一、背景知识1.1 人脸检测和轮廓提取的意义1.2 人脸检测方法概述1.3 轮廓提取方法概述二、常用的人脸轮廓提取方法2.1 基于边缘检测的轮廓提取2.2 基于形态学操作的轮廓提取2.3 基于特征点检测的轮廓提取三、Python实现人脸轮廓提取3.1 安装依赖库3.2 使用Dlib进行人脸检测…...
Prettier+Vscode setting提高前端开发效率
文章目录 前言Prettier第一步:下载依赖(团队合作)或下载插件(独立开发)第二步:添加.prettierrc.json文件**以下是我使用的****配置规则** 第三步:添加.prettierignore文件**以下是我常用的****配…...
YOLOv10实时端到端目标检测
文章目录 前言一、非极值大抑制(NMS)二、NMS算法的具体原理和步骤三、YOLOV10创新点四、YOLOv10使用教程五、官方github地址 前言 距离上次写YOLOv5已经过去了两年,正好最近用YOLOv10重构了项目,总结下YOLOv10。 YOLOv10真正实时端到端目标检测ÿ…...
Java中的Annotation注解
常用注解 override:重写方法deprecated:弃用SuppressWarnings:抑制编译器警告 元注解(注解的注解) Target:描述注解所能修饰的类型Retention:描述注解的生命周期(SOURCE源代码、C…...
小五金加工:细节决定产品质量与性能
在小五金加工领域,细节往往决定着最终产品的质量、性能以及市场竞争力。看似微不足道的细微之处,实际上蕴含着巨大的影响。时利和将介绍小五金加工中细节的重要性。 首先,细节关乎产品的精度。小五金零件通常尺寸较小,但对精度的要…...
VS Code安装配置ssh服务结合内网穿透远程连接本地服务器详细步骤
文章目录 前言1. 安装OpenSSH2.VS Code配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...
html做网站公告/制作网页的流程
分区查看 df命令可以展示任何“mounted”文件系统的磁盘利用率。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 df 参数: 示例: $ df -h Filesystem Size Used Avail Use% Mounted on /dev/map…...
怎么用手机建网站/南宁seo多少钱报价
“大家注意,十分钟后,到小会议室集合,开会!” 作为小组的Leader和架构师,凌云的话从来都是这么简短,大家不用多想,赶快准备吧,把手头的工作赶快收收尾,十分钟之后一定要准…...
做网站要用服务器吗/广州关键词快速排名
采用merge语句的非关联形式再次显神能 采用merge语句的非关联形式再次显神能 题记:采用merge语句的非关联形式确实可以提高update语句的性能,尤其对于百万级别的数据量,之前的一个关于merge语句的优化案例请参考: http://blog.it…...
站长平台网站/手机cpu性能增强软件
变量默认初始化的几种不同情况 #include <iostream> #include <string>string global_str; int global_int; static int sglobal_x;int main() {static int slocal_x;int local_int;string local_str; }对于string类型的变量来说,因为string类型本身接收…...
郴州建设企业网站/盛大游戏优化大师
前言 在做ERPapp或者电商app经常需要展示商品信息,本文以入库单详情为例子,具体效果如下: code 用法 V: cell的创建case ERPStockInOrderDetailVSection4StockInGoodInfo:{ERPStockInOrderDetailDto* model= self.viewModel.model.stockInOrderDe...