首页
论坛
电子技术基础
模拟技术
可编程器件
嵌入式系统与MCU
工程师职场
最新帖子
问答
版主申请
每月抽奖
商城免费换礼
社区有奖活动
博客
下载
评测
视频
文库
芯语
资源
IIC Shanghai 2023
在线研讨会
EE直播间
小测验
白皮书
行业及技术活动
杂志免费订阅
免费在线工具
厂商中心
论坛
博文
电子工程专辑
电子技术设计
国际电子商情
资料
白皮书
研讨会
芯语
文库
登录|注册
登录
最新发表
推荐阅读
明星博主
原创博文
年度排行
博文排行
博文评论
FPGA/CPLD
MCU/ 嵌入式
模拟
电源/新能源
测试测量
通信
智能手机
处理器与DSP
PCB
汽车电子
消费电子
智能硬件
物联网
软件与OS
采购与分销
供应链管理
工程师职场
EDA/ IP/ 设计与制造
无人机
机器人/ AI
医疗电子
工业电子
管理
写博文
aas7502987
修改
文章:
215
阅读:
490715
评论:
87
赞:
445
好友
私信
个人主页
文章
215
原创
0
阅读
490715
评论
87
赞
445
原创
uC/OS II中的内存管理模块
2010-7-6 10:33
1778
2
2
分类:
MCU/ 嵌入式
内存管理模块主要由一个数据结构体和五个函数组成:
◇ 内存控制块数据结构OS_MEM
◇ 内存分区建立函数OSMemCreate()
◇ 内存块分配函数OSMemGet()
◇ 内存块释放函数OSMemPut()
◇ 内存分区状态查询函数OSMemQuery()
◇ 内存控制块链表初始化函数OSMemInit()
他们一同构成内存管理模块来对需要管理的内存块进行简单的管理――分配(动态分配)和释放(动态回收);
◇ 内存控制块数据结构OS_MEM
typedef struct {
void *OSMemAddr;
void *OSMemFreeList;
INT32U OSMemBlkSize;
INT32U OSMemNBlks;
INT32U OSMemNFree;
} OS_MEM;
系统中每个内存分区必须有一个属于自己的内存控制块,只有这样,内存管理模块中的五个函数才能对这个内存分区进行管理和操作;
操作系统首先在内存中声明了一个全局的内存控制块数组和指针:
static OS_MEM *OSMemFreeList;
static OS_MEM OSMemTbl[OS_MAX_MEM_PART];
然后在系统初始化的时候调用内存控制块链表初始化函数把这个全局的内存控制块数组OSMemTbl[ ]构建成一个单向链表,并把这个链表的头指针赋给OSMemFreeList,这样以后,每当用内存分区建立函数OSMemCreate()建立一个分区时,从这个链表中取出一个内存控制块来对这个内存分区进行管理;内存控制块数组的大小决定系统中内存分区的最大数目;
◇ 内存分区建立函数OSMemCreate()
要建立一个内存分区,必须具备三个条件:
1. 有供建立内存分区的内存空间:一般处理方法是以二维数组的形式来声明一个变量,这个变量在编译、链接的时候必定分配给一定的内存空间,这个内存空间只能通过内存块分配函数来获取使用;
2. 内存控制块数组中有闲置的内存控制块:一般的处理方法是先统计需要建立的内存分区的数目,然后依此来声明足够的内存控制块;
3. 声明一个内存控制块指针,便于以后对这个内存分区的访问;
内存分区建立后,这个二维数组就被构建成了一个单向链表,每个节点就是一个内存块,它由两部分组成:指向下一个内存块的指针(不能用来作为动态内存来使用)、能够作为动态内存来使用的存储空间;
◇ 内存块分配函数OSMemGet()
用户创建的任务要使用内存分区中的内存块,就必须通过调用内存分配函数来申请;一般的处理方法是:先在用户任务中声明一个void类型的指针和一个INTU8 型变量,然后调用OSMemGet()来从指定的内存分区中申请一个内存块,并把内存块的指针赋给预先声明的void类型指针;接着对INTU8 型变量进行判断,看申请内存块是否成功。如果成功,就可以使用这个内存块中可以用动态使用的存储空间。
◇ 内存块释放函数OSMemPut()
用户创建的任务不在使用申请来的内存块的时候,必须及时的调用OSMemPut()来把内存块释放到相应的内存分区中去。需要注意的是,这个内存块从那个内存分区中申请来的就必须释放到那个内存分区中去,否则会造成系统崩溃;这个用户在编写任务的时候注意就可以避免了;
OSMemGet()和OSMemPut()应该成对使用;
◇ 内存分区状态查询函数OSMemQuery()
调用内存分区状态查询函数可以获取一个内存分区的相关信息,它的实现方法就是把内存分区控制块中的信息拷贝到OS_MEM_DATA的数据结构体中供调用查看、使用;那么大家也许会问为什么我们不直接通过访问分区控制块来获取这个分区的使用信息呢?这就涉及到代码的临界区的问题。试想如果我们直接访问内存控制块中的域的话而没有关中断的话,那么如果时钟节拍到来的时候我们的访问肯定被打断(我们只获取了内存分区的部分信息,还有部分信息没来得及获取),这个时候通过调度准备就绪而且优先级高的任务得以运行,那么前面的任务就得等待;试想现在运行的任务如果对这个内存分区进行操作的话,那么上一个任务获取的内存分区的信息就不一致了,这个可能给我们不可预测的后果;为此在访问内存分区控制块前,我们得关中断,之后我们还得开中断,这个给我们的移值带来琐碎的麻烦!这也就是编写这个函数的原因!
下面就内存管理模块来举个例子:
#define BlockNum 100
#define BlockSize 32
OS_MEM *CommRAMA_Ptr;
OS_MEM *CommRAMB_Ptr;
INT8U CommRAMA[BlockNum][BlockSize];
INT8U CommRAMB[BlockNum][BlockSize*4];
… … … …
void main(void)
{
INT8U error;
… … … …
/*用内存分区建立函数OSMemCreate()把这两块RAM存储空间构建成内存 */
/*区,并把管理这两块内存分区的内存分区控制块的地址赋给两个OS_MEM指针*/
CommRAMA_Ptr=OSMemCreate(CommRAMA,BlockNum, BlockSize,error);
CommRAMB_Ptr=OSMemCreate(CommRAMB,BlockNum, BlockSize*2,error);
… … … …
OSStart();
}
void MyTask(void)
{
… … … …
INT8U Error;
OS_MEM_DATA MemInfo;
INT8U BlkA_Ptr,BlkB_Ptr;
… … … …
for(){
Error= OSMemQuery(CommRAMA_Ptr,&MemInfo); ------(1)
If(MemInfo.OSNFree≥2){ ------(2)
BlkA_Ptr=(INT8U *)OSMemGet(CommRAMA_Ptr,&Error); ------(3)
BlkB_Ptr=(INT8U *)OSMemGet(CommRAMA_Ptr,&Error); ------(4)
/*使用获得的内存块*/
… … … …
/*释放获得的内存块*/
OSMemPut(CommRAMA_Ptr,BlkA_Ptr);
OSMemPut(CommRAMA_Ptr,BlkB_Ptr);
}else{
Error= OSMemQuery(CommRAMB_Ptr,&MemInfo);
If(MemInfo.OSNFree≥1){
BlkA_Ptr=(INT8U *)OSMemGet(CommRAMB_Ptr,&Error);---(5)
/*使用获得的内存块*/
… … … …
/*释放获得的内存块*/
OSMemPut(CommRAMA_Ptr,BlkB_Ptr);
}else{
OSTimeDly(1); /*等待一个时钟节拍*/
}
}
… … … …
}
}
系统建立了两个内存分区:内存分区CommRAMA的内存块的大小为32个INT8U(可用的为31个INT8U),内存分区CommRAMB的内存块的大小为128个INT8U(可用的为127个INT8U);现在用户创建了一个名为MyTask的任务,它运行时需要一个大小为60个INT8U的内存空间,在这个系统有两个解决办法:从内存分区CommRAMA中申请两个内存块以及从内存分区CommRAMB中申请一个内存块;具体的实现方法是先获取内存分区CommRAMA的使用信息,看有没有足够的内存块(剩余块数不小于2)如果够的话,就不用从内存分区CommRAMB中申请了,否则就的从CommRAMB中申请,如果这里也没有的话,那么就等待一个时钟节拍!
使用内存管理模块需要做的工作还有:
1.打开配置文件OS_CFG.H,将开关量OS_MEM_EN设置为1:
#define OS_MEM_EN 0
2.打开配置文件OS_CFG.H,设置系统要建立的任务分区的数量:
#define OS_MAX_MEM_PART 2
点赞(
2
)
收藏
分享到:
上一篇:
uC/OS-II中优先级翻转问题
下一篇:
基于uC/OS-II的文件系统设计
【报名】2023 国际AIoT生态发展大会(深圳)
【直播报名】汽车半导体中的功率器件及 MEMS 器件设计
【报名】2023年STM32中国峰会暨粉丝狂欢节
【Fabless100 直播】高性能计算的AI设计挑战
文章评论
(
0
条评论)
登录
后参与讨论
您需要登录后才可以评论
登录
|
立即注册
发布
相关推荐阅读
aas7502987
2012-04-07 11:48
51/STC最小系统板资料(更新中)
图片欣赏 淘宝网址:http://item.taobao.com/auction/item_detail.htm?item_num_id=9073446988 二 程...
aas7502987
2011-10-13 22:59
YL-3 资料
YL-3数码管模块资料:YL-3 串行数码管资料.zip...
aas7502987
2011-09-24 09:10
USB转TTL小板驱动
xp系统驱动:XP系统支持STC下载的PL-2303HX新版驱动.rar WIN7系统驱动:WIN7系统支持STC下载的PL2303HX驱动.rar...
aas7502987
2011-05-24 22:48
STM32F103RBT6最小系统原理图 PCB
STM32F103RBT6最小系统板原理图 PCB 附件:做好的成品板:淘宝链接网址:http://item.taobao.com/item.htm?id=8864376956...
aas7502987
2011-05-08 12:53
YL-16 STM32F103最小系统板资料(更新中)
二 数据手册: USB协议中文版:attachment download 中文数据手册:attachment downloadSTM32选型手册:attachment downloadSTM32勘...
aas7502987
2011-03-20 13:27
DS18B20温度测量模块
DS18B20 数码管温度显示程序:...
aas7502987
修改
文章:
215
阅读:
490715
评论:
87
赞:
445
好友
私信
个人主页
文章
215
原创
0
阅读
490715
评论
87
赞
445
最新评论
更多
技术发展真快啊 都6G了啊
curton
评论博文
2023-6-1
AMEYA360报道:人工智能在5G和6G网络中的应 ...
山东大姨方言语音被识别成英语 网友:会英语的不会英语的都沉默了 人民视频 2023-05-31 07:27 https://wap.peopleapp.com/v ...
自做自受 ...
评论博文
2023-5-31
人工智能快速发展趋势下,中国该如何应对? ...
哈哈 可以直接拿来用了
curton
评论博文
2023-5-31
【IoT毕设】ESP8266模块+机智云AIoT+智能插 ...
最新
博文
同轴线开发生产的高频特性管控与不良 ...
【亚马逊下架】英国纽扣/硬币电池安全 ...
一文搞懂FPC系列——FPC生产工艺全流 ...
资料下载
本周热帖
跟我一起写DApp(转型区块链开发推荐 ...
计算机硬件技术基础 金泰松 ...
计算机硬件技术基础 裘正定 ...
从0写自己的Linux x86操作系统(源码+ ...
CS5290兼容CS5230防破音AB/D切换,5.2 ...
黄仁勋致毕业生们:AI时代,全力以赴 ...
【2023下载活动第2季】粽享好礼!传资 ...
【变废为宝】国货当自强——某国内大 ...
【嵌入式Linux开发】《C语言(十:5分 ...
传联想、浪潮等多家企业已停购含美光 ...
最新资讯
芯语最新
世界首条标准包层直径的19芯光纤,创 ...
注资1亿!又一家手机厂商成立集成电路 ...
IGBT持续缺货的三个原因
智能手机市场萎靡 联发科在汽车领 ...
物联网传感器在智能家居和智慧城市中 ...
为什么亚马逊股价会在今年上涨?亚马逊 ...
在电子烟受到监管的环境下,雾芯科技 ...
美国餐饮连锁集团【CAVA Group】申请 ...
高压放大器和示波器的关系是什么 ...
功率放大器在无线充电中的应用有哪些 ...
EE直播间
更多
Fabless100系列技术和应用直播 – 蓝牙音频/网络技术的最新应用和市场趋势
直播时间: 06月16日 10:00
Fabless100系列技术和应用直播 – GPU助力数据中心高性能计算和AI大模型的开发
直播时间: 06月27日 10:00
创芯未来:是德科技前沿技术交流会 – 深圳高校专场
直播时间: 06月28日 13:30
Fabless100系列技术和应用直播 – 工业MCU的设计、测试及应用市场分析
直播时间: 07月14日 10:00
在线研讨会
更多
USB 2.0通过第二代USB隔离器实现高速稳定隔离
专设蓝牙、Matter、Wi-Fi和LPWAN主题!即刻报名芯科科技Tech Talks 在线技术讲座
为智能工厂设计工业连接解决方案
逻辑分析仪,你什么时候需要TA?
热门
推荐
【报名赢耳机】加速HPC未来: 224G以太网IP推动力
走进逻辑分析仪,报名抽示波器!
【6.20直播】基于总线架构SSN技术,颠覆传统测试设计
【6.29直播】西门子EDA工具在3D IC设计中的应用
我要评论
0
2
分享到微信
分享到微博
分享到QQ
点击右上角,分享到朋友圈
我知道啦
请使用浏览器分享功能
我知道啦
×
余额支付
请输入6位数字支付密码
忘记密码?
确认支付
×
×
微信扫码支付
支付金额
1
元
1
2
3
4
5
6
7
8
9
0
×
给作者打赏,鼓励TA抓紧创作!
请选择支付金额
1
元
2
元
5
元
10
元
50
元
自定义
请选择支付方式
微信支付
余额支付
×
确认支付
¥ 1
×
0人赞赏(共赞赏
¥
)
关闭
热点推荐
/3
【6.20直播】基于总线架构SSN技术,颠覆传统测试设计
通过技术实现解析和用户案例分享,全方位介绍 SSN 如何帮助用户降低设计工作量,节省测试成本,实现更优的功耗、性能和面积。
【6.29直播】西门子EDA工具在3D IC设计中的应用
本次线上研讨会将介绍西门子 EDA 工具在 3D IC 设计中的应用。 3D IC 是一种新的封装技术,通过垂直堆叠多个芯片来实现更高的电路密度。 西门子 EDA 提供了一系列设计、验证、仿真、热分析、测试和 IP 验证工具,帮助设计人员更好地实施 3D IC 设计。
粽享好礼!传资料,领800元奖金!
端午佳节到,下载中心的活动也到啦! 快来传资料,质量越优奖励越大!最高可获得800元的奖励~
首页
论坛
电子技术基础
模拟技术
可编程器件
嵌入式系统与MCU
工程师职场
最新帖子
问答
版主申请
每月抽奖
商城免费换礼
社区有奖活动
博客
下载
评测
视频
文库
芯语
资源
IIC Shanghai 2023
在线研讨会
EE直播间
小测验
白皮书
行业及技术活动
杂志免费订阅
免费在线工具
厂商中心
帖子
博文
返回顶部
×
文章评论(0条评论)
登录后参与讨论