uCOSII实时操作系统内核源代码注释.docx
- 文档编号:2750634
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:17
- 大小:21.12KB
uCOSII实时操作系统内核源代码注释.docx
《uCOSII实时操作系统内核源代码注释.docx》由会员分享,可在线阅读,更多相关《uCOSII实时操作系统内核源代码注释.docx(17页珍藏版)》请在冰点文库上搜索。
uCOSII实时操作系统内核源代码注释
/*
*********************************************************************************************************
* uC/OS-II
* 实时操作内核
* 内存管理
*
* (c)版权1992-2002,JeanJ.Labrosse,Weston,FL
* AllRightsReserved
*
*文件名:
OS_MEM.C
*作者 :
JeanJ.Labrosse
*注释 :
彭森2007/9/2
*********************************************************************************************************
*/
#ifndef OS_MASTER_FILE
#include"includes.h"
#endif
#if(OS_MEM_EN>0)&&(OS_MAX_MEM_PART>0)
/*
*********************************************************************************************************
* 创建一个内存分区
*
*说明 :
创建一个固定大小的内存分区,这个内存分区通过uC/OS-II管理。
*
*参数 :
addr 内存分区的起始地址
*
* nblks 来自分区的内存块的数目.
*
* blksize 每个内存分区中的内存块的大小.
*
* err 指向一个变量包含错误的信息,这个信息通过这个函数或其他来设置:
*
* OS_NO_ERR 内存分区创建正确返回值.
* OS_MEM_INVALID_ADDR 指定的是无效地址作为分区的内存存储空间
* OS_MEM_INVALID_PART 没有未使用的有用的分区
* OS_MEM_INVALID_BLKS 使用者指定一个无效的内存块(必须>=2)
* OS_MEM_INVALID_SIZE 使用者指定一个无效的内存空间值
* (必须大于指针的空间大小)
*返回值 :
!
=(OS_MEM*)0 分区被创建
* ==(OS_MEM*)0 分区没有被创建由于无效的参数,没有未使用的分区可用
*********************************************************************************************************
*/
OS_MEM *OSMemCreate(void*addr,INT32Unblks,INT32Ublksize,INT8U*err)
{
#ifOS_CRITICAL_METHOD==3 /*AllocatestorageforCPUstatusregister为CPU状态寄存器分配存储空间 */
OS_CPU_SR cpu_sr;
#endif
OS_MEM *pmem;
INT8U *pblk;
void **plink;
INT32U i;
#ifOS_ARG_CHK_EN>0
if(addr==(void*)0){ /*Mustpassavalidaddressforthememorypart.必须是一个有效的内存部分*/
*err=OS_MEM_INVALID_ADDR;
return((OS_MEM*)0);
}
if(nblks<2){ /*Musthaveatleast2blocksperpartition 每个分区至少有两个分区*/
*err=OS_MEM_INVALID_BLKS;
return((OS_MEM*)0);
}
if(blksize *err=OS_MEM_INVALID_SIZE; return((OS_MEM*)0); } #endif OS_ENTER_CRITICAL(); pmem=OSMemFreeList; /*Getnextfreememorypartition 得到下一个未使用的内存分区*/ if(OSMemFreeList! =(OS_MEM*)0){ /*Seeifpooloffreepartitionswasempty 查看是否有未使用的分区空间是空的*/ OSMemFreeList=(OS_MEM*)OSMemFreeList->OSMemFreeList; } OS_EXIT_CRITICAL(); if(pmem==(OS_MEM*)0){ /*Seeifwehaveamemorypartition 查看是否我们有一个内存分区*/ *err=OS_MEM_INVALID_PART; return((OS_MEM*)0); } plink=(void**)addr; /*Createlinkedlistoffreememoryblocks 创建未使用的内存块的可连接的列表*/ pblk =(INT8U*)addr+blksize; for(i=0;i<(nblks-1);i++){ *plink=(void*)pblk; plink =(void**)pblk; pblk =pblk+blksize; } *plink =(void*)0; /*LastmemoryblockpointstoNULL 最后的内存块指针指向NULL*/ pmem->OSMemAddr =addr; /*Storestartaddressofmemorypartition 保存内存分区的起始地址*/ pmem->OSMemFreeList=addr; /*Initializepointertopooloffreeblocks 为未使用的内存块初始化指针*/ pmem->OSMemNFree =nblks; /*StorenumberoffreeblocksinMCB 在内存控制块中保存许多未使用的内存块*/ pmem->OSMemNBlks =nblks; pmem->OSMemBlkSize =blksize; /*Storeblocksizeofeachmemoryblocks 保存每个内存块的块大小*/ *err =OS_NO_ERR; return(pmem); } /*$PAGE*/ /* ********************************************************************************************************* * 得到一个内存控制块 * *说明 : 从分区中得到一个内存块 * *参数 : pmem 指针指向一个内存分区控制块 * * err 指向一个变量包含一个错误信息,这个错误信息通过这个函数或其他来设计 * * OS_NO_ERR 假如内存分区被正确的创建. * OS_MEM_NO_FREE_BLKS假如没有更多的内存块被分配给调用者 * OS_MEM_INVALID_PMEM假如已经为'pmem'通过一个空指针 * *返回值 : 一个指针指向一个内存控制块,假如没有察觉错误 * 一个指针指向空指针,假如有错误被察觉到 ********************************************************************************************************* */ void *OSMemGet(OS_MEM*pmem,INT8U*err) { #ifOS_CRITICAL_METHOD==3 /*AllocatestorageforCPUstatusregister 为CPU状态寄存器分配存储空间 */ OS_CPU_SR cpu_sr; #endif void *pblk; #ifOS_ARG_CHK_EN>0 if(pmem==(OS_MEM*)0){ /*Mustpointtoavalidmemorypartition 必须指向一个有效的内存分区 */ *err=OS_MEM_INVALID_PMEM; return((OS_MEM*)0); } #endif OS_ENTER_CRITICAL(); if(pmem->OSMemNFree>0){ /*Seeifthereareanyfreememoryblocks 查看是否有其他未使用的内存块*/ pblk =pmem->OSMemFreeList; /*Yes,pointtonextfreememoryblock 是的,指针指向下一个未使用的内存块*/ pmem->OSMemFreeList=*(void**)pblk; /* Adjustpointertonewfreelist 调整指针指向一个新的未使用的空间列表*/ pmem->OSMemNFree--; /* Onelessmemoryblockinthispartition 在这个分区中减少一个内存块*/ OS_EXIT_CRITICAL(); *err=OS_NO_ERR; /* Noerror 没有错误*/ return(pblk); /* Returnmemoryblocktocaller 返回内存控制块给调用者*/ } OS_EXIT_CRITICAL(); *err=OS_MEM_NO_FREE_BLKS; /*No, Notifycallerofemptymemorypartition 告知调用者是空的内存分区*/ return((void*)0); /* ReturnNULLpointertocaller 返回NULL个调用者*/ } /*$PAGE*/ /* ********************************************************************************************************* * 释放一个内存块 * *说明 : 返回一个内存块给分区 * *参数 : pmem 指针指向内存分区控制块 * * pblk 指针指向被保留的内存块. * *返回值 : OS_NO_ERR 假如内存块是被插入的分区 * OS_MEM_FULL 假如返回一个已经全部内存分区的内存块 * (你释放了更多你分配的内存块! ) * OS_MEM_INVALID_PMEM 假如指针'pmem'指向NULL。 * OS_MEM_INVALID_PBLK 假如指向释放的内存块为空. ********************************************************************************************************* */ INT8U OSMemPut(OS_MEM *pmem,void*pblk) { #ifOS_CRITICAL_METHOD==3 /*AllocatestorageforCPUstatusregister 为CPU状态寄存器分配存储空间 */ OS_CPU_SR cpu_sr; #endif #ifOS_ARG_CHK_EN>0 if(pmem==(OS_MEM*)0){ /*Mustpointtoavalidmemorypartition 必须指向一个有效的内存分区 */ return(OS_MEM_INVALID_PMEM); } if(pblk==(void*)0){ /*Mustreleaseavalidblock 必须保留一个有效的内存块 */ return(OS_MEM_INVALID_PBLK); } #endif OS_ENTER_CRITICAL(); if(pmem->OSMemNFree>=pmem->OSMemNBlks){ /*Makesureallblocksnotalreadyreturned 确认所有的内存块没有已经返回 */ OS_EXIT_CRITICAL(); return(OS_MEM_FULL); } *(void**)pblk =pmem->OSMemFreeList; /*Insertreleasedblockintofreeblocklist 将释放的内存块插入未使用的内存块表 */ pmem->OSMemFreeList=pblk; pmem->OSMemNFree++; /*Onemorememoryblockinthispartition 在分区中增加一个内存块 */ OS_EXIT_CRITICAL(); return(OS_NO_ERR); /*Notifycallerthatmemoryblockwasreleased 告知调用者内存块被释放 */ } /*$PAGE*/ /* ********************************************************************************************************* * 查询内存分区 * *说明: 这个函数被使用来查询在内存分区中已经使用的内存块数及尚未使用的内存数 * * *参数 : pmem 指针指向一个内存分区控制块 * * pdata 指针指向一个结构体,该结构体包含关于内存分区的信息 * *返回值 : OS_NO_ERR 假如没有错误发生. * OS_MEM_INVALID_PMEM 假如指针'pmem'指向NULL。 * OS_MEM_INVALID_PDATA假如指向释放的内存块为空. ********************************************************************************************************* */ #ifOS_MEM_QUERY_EN>0 INT8U OSMemQuery(OS_MEM*pmem,OS_MEM_DATA*pdata) { #ifOS_CRITICAL_METHOD==3 /*AllocatestorageforCPUstatusregister 为CPU状态寄存器分配存储空间 */ OS_CPU_SR cpu_sr; #endif #ifOS_ARG_CHK_EN>0 if(pmem==(OS_MEM*)0){ /*Mustpointtoavalidmemorypartition 必须指向一个有效的内存分区 */ return(OS_MEM_INVALID_PMEM); } if(pdata==(OS_MEM_DATA*)0){ /*Mustreleaseavalidstorageareaforthedata 为这些数据必须释放一个有效的存储区域 */ return(OS_MEM_INVALID_PDATA); } #endif OS_ENTER_CRITICAL(); pdata->OSAddr =pmem->OSMemAddr; pdata->OSFreeList=pmem->OSMemFreeList; pdata->OSBlkSize =pmem->OSMemBlkSize; pdata->OSNBlks =pmem->OSMemNBlks; pdata->OSNFree =pmem->OSMemNFree; OS_EXIT_CRITICAL(); pdata->OSNUsed =pdata->OSNBlks-pdata->OSNFree; return(OS_NO_ERR); } #endif /*OS_MEM_QUERY_EN */ /*$PAGE*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uCOSII 实时 操作系统 内核 源代码 注释
![提示](https://static.bingdoc.com/images/bang_tan.gif)