ucos II 内核学习之七:内存管理

uCOS-II源码下载及源码目录结构   攻克RTOS之旅,扬帆起航!   RTOS有众多种,个人感觉,用得最火的是FreeRTOS,因为它即使用于商业途径,也是开源免费的;其次是就是uCOS-II和uCOS-III。uCOS-II用于商业途径是需要付费的,但是对于学习研究却是免费的。它们同是嵌入式实时操作系统,很多东西都是共通的,熟悉其一,其它都非难题了。   RTOS的学习,我选择的是uCOS-II。学习该操作系统的流程,主要... 阅读详情
 Ucos II 内存管理
     在mcu21的项目里,暂时还没用到内存管理。不过还是有必要学习一下的。
    为了消除内存碎片,ucos II 把连续的大块内存按分区来管理。每个分区中包含有整数个大小相同的内存块。

    类似每个任务对应一个任务控制块,每个事件对应一个事件控制块,ucos II里每个内存块也是对应一个内存控制块。内存控制块是一个数据结构,定义如下:

[cpp]  view plain copy
  1. typedef struct {  
  2.     void   *OSMemAddr;  
  3.     void   *OSMemFreeList;  
  4.     INT32U  OSMemBlkSize;  
  5.     INT32U  OSMemNBlks;  
  6.     INT32U  OSMemNFree;  
  7. } OS_MEM;  
  8.   
  9.     
  10. typedef struct {  
  11.     void   *OSMemAddr;  
  12.     void   *OSMemFreeList;  
  13.     INT32U  OSMemBlkSize;  
  14.     INT32U  OSMemNBlks;  
  15.     INT32U  OSMemNFree;  
  16. } OS_MEM;  

.OSMemAddr是指向内存分区起始地址的指针。它在建立内存分区OSMemCreate()时被初始化,在此之后就不能更改了。
.OSMemFreeList是指向下一个空闲内存控制块或者下一个空闲的内存块的指针,具体含义要根据该内存分区是否已经建立来决定。
.OSMemBlkSize是内存分区中内存块的大小,是用户建立该内存分区时指定的。
.OSMemNBlks是内存分区中总的内存块数量,也是用户建立该内存分区时指定的。
.OSMemNFree是内存分区中当前可以得空闲内存块数量。


完整地使用内存,需要经过以下步骤:
1.     建立一个内存分区(OSMemCreate())
2.     调用OSMemGet()函数从已经建立的内存分区中申请内存块
3.     当用户应用程序不再使用一个内存块时,调用OSMemPut()释放内存。
4.     在这过程中可以调用OSMemQuery()查询一个内存分区的状态
 
建立一个内存分区需要使用ucos II 系统函数OSMemCreate()。实现过程如下:

[cpp]  view plain copy
  1. OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)  
  2. {  
  3.     OS_MEM  *pmem;  
  4.     INT8U   *pblk;  
  5.     void   **plink;  
  6.     INT32U   i;  
  7.    
  8.    
  9.     if (nblks < 2) {                                                   (1)  
  10.         *err = OS_MEM_INVALID_BLKS;  
  11.         return ((OS_MEM *)0);  
  12.     }  
  13.     if (blksize < sizeof(void *)) {                                    (2)  
  14.         *err = OS_MEM_INVALID_SIZE;  
  15.         return ((OS_MEM *)0);  
  16.     }  
  17.     OS_ENTER_CRITICAL();  
  18.     pmem = OSMemFreeList;                                              (3)  
  19.     if (OSMemFreeList != (OS_MEM *)0) {  
  20.         OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;  
  21.     }  
  22.     OS_EXIT_CRITICAL();  
  23.     if (pmem == (OS_MEM *)0) {                                         (4)  
  24.         *err = OS_MEM_INVALID_PART;  
  25.         return ((OS_MEM *)0);  
  26.     }  
  27.     plink = (void **)addr;                                             (5)  
  28.     pblk  = (INT8U *)addr + blksize;  
  29.     for (i = 0; i < (nblks - 1); i++) {  
  30.         *plink = (void *)pblk;  
  31.         plink  = (void **)pblk;  
  32.         pblk   = pblk + blksize;  
  33.     }  
  34.     *plink = (void *)0;  
  35.     OS_ENTER_CRITICAL();  
  36.     pmem->OSMemAddr     = addr;                                        (6)  
  37.     pmem->OSMemFreeList = addr;  
  38.     pmem->OSMemNFree    = nblks;  
  39.     pmem->OSMemNBlks    = nblks;  
  40.     pmem->OSMemBlkSize  = blksize;  
  41.     OS_EXIT_CRITICAL();  
  42.     *err   = OS_NO_ERR;  
  43.     return (pmem);                                                     (7)  

        该函数共有4个参数:内存分区的起始地址、分区内的内存块总块数、每个内存块的字节数和一个指向错误信息代码的指针。如果OSMemCreate()操作失败,它将返回一个NULL指针。否则,它将返回一个指向内存控制块的指针。对内存管理的其它操作,象OSMemGet(),OSMemPut(),OSMemQuery()函数等,都要通过该指针进行。
在mcu21的理解中,以上程序,简单来说,主要执行以下两大步骤,一是从空闲内存控制块中获取一个内存控制块,二是初始化这块内存控制块。


UCOS_II与ecos之对比 个人觉得用ecos更有前景,无论是从实时性,还是驱动支持(有网络驱动),以及功能上(支持文件系统),都比uCOS2强,尤其是其灵活,高效的可配置性。当然uCOS_II的确非常适合于用来学习嵌入式实时操作系统的原理。uCOS提供的支持太少,仅仅包括内核一点而且收费不便宜,光一个2.52的内核商用就要上W,不过用来学习操作系统原来倒是很不错的选择。μC/OS-IIμC/OS-II的前射 阅读详情

相关推荐

学习-嵌入式实时操作系统uCOS-II

文章目录1 简介1 uCOS-II中的任务 1 简介 uCOS-II实时操作系统 实时操作系统与分时操作系统的区别:分时操作系统将时间一块一块的分给不同的任务。 实时操作系统提供给用户三样东西:内存管理、多任务管理调度、外围资源管理。主要是提供内核,外围很多东西用户自己写。 1 uCOS-II中的任务 操作系统的内核的主要工作就是对任务进行管理和调度。 一个任务相当于一个死循环,相当于一个线程。 这个操作系统如何管理任务:任务控制块TCB。 这个操作系统的任务分为系统任务和用户任务,系统任务是系统内

q742971636的博客 2410

函数OSMemCreate()理解,二级指针,二维数组,强制转换

建立一个内存分区的步骤是先建立一个二维数组,二维数组的第一维是块数,第二维是块的大小,二维数组把一块连续的内存占了(虽然占了,但是并不能有详细的管理),然后把这个二维数组的地址给OSMemCreate()函数,进行一系列设置,方便系统对这块连续的内存进行管理。 函数作用:把二维数组与内存控制块联系起来,行程内存分区;

Wang_yf_的博客 2760

深入探索实时操作系统uCOS-II的设计与应用

本文还有配套的精品资源,点击获取 简介:本书系统地介绍了实时操作系统(RTOS)的设计和使用,特别是uCOS-II的核心概念和机制。uCOS-II是一个针对资源有限的嵌入式设备设计的高效实时操作系统内核,涉及任务调度、内存管理、任务间通信以及中断处理等关键技术。本书详细阐释了uCOS-II的优先级调度、内存管理、同步机制、中断处理、定时器服务等关键组成部分,并介绍了其在多种...

weixin_32661831的博客 1068

ucos中OSMemXX分析-----指向指针的的指针--强制转换

下面8行代码的含义是什么: #define nblks 10 #define blksize 20 INT8U *pblk; void **plink; INT8U addr[200]; plink = (void **)addr;/* Create linked list of free memory blocks */ pblk = (INT8U *)((INT3

quanguoheme的专栏 975

深入学习UCOS操作系统:任哲教授的课程资料

本文还有配套的精品资源,点击获取 简介:本压缩包含了一系列关于UCOS实时操作系统的理论教材、教学课件以及实践案例,由任哲教授提供。UCOS(uController Operating System)是一款专门适用于嵌入式系统的流行小型实时操作系统。理论教材能够帮助理解UCOS的基础概念和工作机制;教学课件提供直观演示,帮助掌握操作系统原理;而课后例题和案例分析则是实践操作...

weixin_35762258的博客 1277

uCOS-II官方版V290的下载与应用

uC/OS-II 是一个通用的实时操作系统(RTOS),由美国工程师 Jean J. Labrosse 开发,广泛应用于嵌入式系统领域。它具有可裁剪性、可移植性、可确定性等优点,让开发者能够为各种微处理器、微控制器及DSP(数字信号处理器)等硬件平台构建高度可靠的实时应用程序。

weixin_42511373的博客 858

自己写个malloc函数,从ucos 2移植过来

由于写arm裸机程序,需要用到malloc,进行动态内存管理,所以就试着自己搞个简单的内存管理。 若其中有纰漏,还忘指正。 此动态内存管理源自ucos的动态内存管理,比较简陋,同样的动态内存管理还有Doug Lea  的dlmalloc,不多说切入正题。 由于ucos动态内存管理很多人已经讲过,所以现贴下代码。 malloc.h /* ******************

看云上有个人的专栏 2703

uCOS-II V2.83源码解析与学习指南

本文还有配套的精品资源,点击获取 简介:《uCOS-II V2.83源码解析与学习指南》详细介绍了uCOS-II V2.83这个稳定高效的嵌入式实时操作系统(RTOS),由法国Micrium公司开发。文章深入解析了其源码,讨论了核心功能和设计思想,帮助读者理解和应用这一系统。本文概述了uCOS-II的特点、源码结构、关键组件以及如何进行移植与应用。同时,提供了一个学习路径和...

weixin_29903713的博客 1218

os_mem.c(全)

本篇介绍内存管理方面的内容,具体如下:简单介绍内存管理新建内存单元OS_MEM  *OSMemCreate (void *addr,INT32U nblks,INT32U  blksize,INT8U  *perr)获得内存块void  *OSMemGet (OS_MEM  *pmem,INT8U *perr)得到内存分区名称INT8U  OSMemNameGet (OS_MEM   *pmem,...

allein_STR的博客 1393

uCOS-II EBSS源代码解析与学习指南

实时操作系统(RTOS)是嵌入式系统开发中不可或缺的一部分,它确保了程序可以按照严格的时序要求执行。uCOS-II是一种流行的实时内核,由Jean J. Labrosse开发,广泛用于嵌入式应用中,尤其在资源受限的系统里表现出色。它的核心特征是抢占式调度,该调度策略允许具有更高优先级的任务在任何时候中断当前任务的执行,从而满足实时性的需求。抢占式内核具备快速响应外部事件的能力,这对于实时系统来说至关重要,如工业自动化、汽车电子等领域。

weixin_42612804的博客 1021

Codex智能体从零搭建:环境配置、代码管理与MCP扩展实战

AI智能体(Agent)作为连接大语言模型与实际应用的关键技术,通过感知、决策与执行框架,将AI能力融入具体工作流。其核心原理在于利用提示工程、上下文管理与工具调用,将自然语言指令转化为可执行操作。在软件开发领域,AI智能体能够显著提升代码生成、项目管理和自动化任务的效率。通过Model Context Protocol(MCP)等标准化协议,智能体可以安全、结构化地集成外部工具与服务,实现能力扩展。本文聚焦于Codex这一AI驱动的代码助手平台,详细解析其环境配置、代码索引、记忆系统等核心模块,并深入探讨

weixin_34220179的博客 593

一步一步教你使用uCOS-II

第一篇 UCOS介绍 第一篇 UCOS介绍   这个大家都知道。呵呵。考虑到咱们学习的完整性还是在这里唠叨一下。让大家再熟悉一下。高手们忍耐一下吧! uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作

overflyme的博客 7万+

MySQL服务启动失败?手把手教你排查NET HELPMSG 3534错误(附完整修复流程)

本文针对Windows平台上MySQL服务启动失败并提示NET HELPMSG 3534错误的常见问题,提供了系统性的排查与修复指南。文章深入剖析了错误本质,并手把手教你通过查看MySQL错误日志、检查并初始化数据目录、修正Windows服务配置、排查my.ini配置文件陷阱等核心步骤,彻底解决这一棘手问题,帮助开发者和运维人员快速恢复数据库服务。

wdx0123456的博客 895

UCOS-II学习文档

UCOS—II 一、实时操作系统的概念 1.1 操作系统 ​ 操作系统是一种系统软件,他在计算机硬件与计算机应用程序之间,通过提供程序接口,屏蔽了计算机硬件工作的一些细节,从提高了应用程序的开发效率。 ​ 应用在嵌入式系统中的操作系统称为嵌入式操作系统 1.2 前后台系统 ​ 不复杂的小系统一般设计成前后台系统(也称超循环系统)。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台系统。中断服务程序处理异步事件,这部分可以看成前台系统。后台也可以叫任务级,前台也可以叫中断级

mjy520123的博客 2200

从Arduino IDE到Atmel Studio:ATmega328P开发的进阶之路

本文探讨了从Arduino IDE转向Atmel Studio进行ATmega328P开发的进阶路径。通过对比两者差异,详细介绍了Atmel Studio的环境配置、寄存器操作思维、烧录方法及高级调试功能,帮助开发者突破Arduino的封装限制,实现对单片机底层硬件的精细控制与性能优化,提升嵌入式开发的专业能力。

weixin_29193259的博客 122

跨模态行人重识别实战:Python复现SYSU-MM01官方评估协议

本文详细介绍了如何用Python复现SYSU-MM01数据集的官方评估协议,以解决原Matlab代码在Python生态中不便使用的问题。文章深入解析了数据集的`indoor`与`all`两种评估模式,并提供了完整的Python代码实现,包括特征加载、相似度计算、Rank-k与mAP指标计算等核心步骤,确保评估结果与官方Matlab版本完全一致,助力跨模态行人重识别研究。

weixin_29081163的博客 99

RTOS之uCOS-II源码下载及源码目录结构、常见的RTOS!

RTOS有众多种,用得最火的是FreeRTOS,因为它即使用于商业途径,也是开源免费的;其次是就是uCOS-II和uCOS-III。uCOS-II用于商业途径是需要付费的,但是对于学习研究却是免费的。它们同是嵌入式实时操作系统,很多东西都是共通的,熟悉其一,其它都非难题了。 常见的RTOS: 1:QNX的可靠性很好,协议栈、各种外设驱动稳定,只是运行所需资源有些多,需要MMU。如果需要高可靠性......

魏波 8939

单片机:实现简单的时间片轮询调度(附完整源码)

单片机:实现简单的时间片轮询调度(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 384

UCOS

第一篇 UCOS介绍 第一篇 UCOS介绍   这个大家都知道。呵呵。考虑到咱们学习的完整性还是在这里唠叨一下。让大家再熟悉一下。高手们忍耐一下吧! uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作

Thomashao的博客 2万+

【知识分享】IBIS 建模指南 05

本文详细阐述了IBIS模型创建过程中的关键技术和数据规范要求。主要内容包括:1. 数据完整性检查要点,强调I-V和V-T数据必须覆盖所有工艺角且匹配;2. 数据限制处理方法,介绍100/1000点限制下的两种数据筛选算法;3. 特殊数据处理技术,包括内部终端电阻调整和V-T表时间窗口选择;4. 高级关键字应用,涵盖[ModelSelector]、[Sub model]、[DiffPin]等复杂功能实现方法;5. 预加重缓冲器等特殊结构的建模方案。

一只豌豆象的博客 1595

将Keil中的变量数组导出

首先,写好导出数据的函数。

小柚子的博客 1952

《嵌入式实时操作系统uCOS-II原理及应用》图书资源

《嵌入式实时操作系统uCOS-II原理及应用》图书资源 【下载地址】嵌入式实时操作系统uCOS-II原理及应用图书资源 这是一本专注于嵌入式实时操作系统uCOS-II的权威书籍——《嵌入式实时操作系统uCOS-II原理及应用》,由任哲编写,内容深入浅出,适合初学者和开发者。书中详细解析了uCOS-II的内核结构、任务管理...

gitblog_06749的博客 1023

MIKE水动力笔记4_制作网格

建立水动力模型前的重要一步就是制作网格,本文所讲内容就是如何在MIKE中制作网格。

晏长街的博客 2万+

UCOS-II 系统的原理和任务-学习日(1)

写在前头 本人嵌入式小辣鸡,本着好记性不如烂笔头的懒惰想法,在网上码起字来。说的容易,还是光看,然后想一想舒服,不过这样也是容易忘得很快。写下自己的想法,和感受更有助于巩固,和以后的复习。所以决定动起手指。敲出来。如笔记中有理解错误,逻辑混乱不流畅的地方,欢迎大牛指正讨论,私信交流。不接受批评! 学习参考资料 《正点原子STM32F428UCOS开发手册》-原子哥 《嵌入式实时操作系统UCOS-I...

weixin_42783751的博客 2202

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

uCOS-II总体介绍

第一篇 UCOS介绍 第一篇 UCOS介绍   这个大家都知道。呵呵。考虑到咱们学习的完整性还是在这里唠叨一下。让大家再熟悉一下。高手们忍耐一下吧! uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作

DaLaoZi的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: ucos II 内核学习之六:ucos II初始化及启动
下一篇: ucos II 创建第一个任务之一
东方青
博客等级 码龄14年 14粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值