ucos中文书第7章内存管理_第1页
ucos中文书第7章内存管理_第2页
ucos中文书第7章内存管理_第3页
ucos中文书第7章内存管理_第4页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7 内存管 内存控制 UsingMemory 1.内存管理ANSICmallocfree()两个函数动态地分配内存和释放内存。但4.02malloc()函µC/OS-II同的内存块,如同图F7.1。利用这种机制,µC/OS-IImalloc(free()函数进行了改进,如图F7.2,在一个系统中可以有多个内存分区。这样,用户的应用程序就可以从不同的内存F7.1FigureF7.2FigureµC/OS-II(memorycontrolblocks)的数据结构来每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。程序L7.1是程序L7.1内存控制块的数据结typedeftypedefstruct INT32UOSMemBlkSize;INT32UOSMemNBlks;INT32UOSMemNFree;}7.1.OSMemBlkSize是内存分区中内存块的大小,是用户建立该内存分区时指定的[见7.1节].OSMemNBlks是内存分区中总的内存块数量,也是用户建立该内存分区时指定的[见7.1.OSMemNFree是内存分区中当前可以得空闲内存块数量如果要在µC/OS-II中使用内存管理,需要在OS_CFG.H文件中将开关量OS_MEM_EN设置为1。F7.3OS_MAX_MEM_PART(见文OS_CFG.H)2。F7.3FigureOSMemCreate()函数来完成。程序L7.2说明了如何建立一个含有100个内存块、每个内存块32字节的内存程序L7.2建立一个内存分OS_MEMOS_MEM voidmain{INT8U..CommTxBuf=OSMemCreate(CommTxPart,100,32,..}程序L7.3是OSMemCreate()函数的源代码。该函数共有4个参数:内存分区的起始地OS_MEMOS_MEM*OSMemCreate(void*addr,INT32Unblks,INT32Ublksize,INT8U{OS_MEM*pmem;INT8U*pblk;voidINT32Uif(nblks<2)*err=return((OS_MEM}if(blksize<sizeof(void*))*err=return((OS_MEMpmem=if(OSMemFreeList!=(OS_MEM*)0)OSMemFreeList=(OS_MEM*)OSMemFreeList-if(pmem==(OS_MEM*)0)*err=return((OS_MEM}plink=(voidpblk=(INT8U*)addr+blksize;for(i=0;i<(nblks-1);i++){*plink=(voidplink=(void程L7.3 =pblk+}*plink=(void*)0;pmem- =pmem->OSMemFreeList= =nblks; =nblks;pmem->OSMemBlkSize=blksize; =return }图F7.4OSMemCreate()函数完成后,内存控制块及对应的内存分区和分区内的内存块之间OSMemCreate()函数返回。显F7.4OSMemCreate()——Figure程序L.4是OSemGet(函数的代码。数的指针pmem指向用希望从中分配内[L7.(1)]。OMemGet(L7.4(2)[L74(3)],[L7.4(41[L.4(5)][L7.(6)]。voidvoid*OSMemGet(OS_MEM*pmem,INT8U{ if(pmem->OSMemNFree>0){=pmem-pmem->OSMemFreeList=*(void*err=OS_NO_ERR;return(pblk);}else*err=OS_MEM_NO_FREE_BLKS;return((void*)0);}}程L7.4情况下,OSMemGet(NULL32 L7.5是OSMemPut()函数的源代码。它的第一个参数pmem是指向内存控制块的指INT8UINT8UOSMemPut(OS_MEM*pmem,void{if(pmem->OSMemNFree>=pmem->OSMemNBlks){return}*(void =pmem- pmem->OSMemFreeList=pmem- return}程L7.5这些信息都放在一个叫OS_MEM_DATA的数据结构中,如程序L7.6。typedeftypedefstructvoid/*void*OSFreeList;/*INT32UOSBlkSize;/*每个内存块所含的字节数*/INT32UOSNBlks; /*内存分区总的内存块数*/INT32UOSNFree; /*空闲内存块总数*/INT32U /*}程L7.6OS_MEM_DATA程序L7.7是OSMemQuery()函数的源代码,它将指定内存分区的信息 到OS_MEM_DATA 修改[L7.7(1)]。由于正在使用的内存块数是由OS_MEM_DATA中的局部变量计算得到的,所以,可以放在(criticalsection中断)的外面。程序L7.7INT8UINT8UOSMemQuery(OS_MEM*pmem,OS_MEM_DATA{pdata- =pmem-pdata->OSFreeList=pmem-pdata->OSBlkSize=pmem->OSMemBlkSize; =pmem->OSMemNBlks; =pmem->OSMemNFree;pdata- =pdata->OSNBlks-pdata- return}UsingMemory图F7.5µC/OS-II第6章]的例子。程序L7.8是这个例子中两个任务的示意代码,其中一些重要代码的标号和图F7.5F7.5Figure程L7.8内存分配的例子——扫描模拟量的输入和报告出错{for(;;)forif}}}}{for(;;)}}特定内存分区增加信号量的方法,实现这种功能(6.05)。应用程序为了申请L7.9。7.91)]C/OS-II调用OSInit()[L7.(2)],紧接着立内存区[L7.94)]和应要该区的任务L7.9(5)。当然,OStart([L7.9(7)OSSmPend(SMeGet())[L7.(9)],程序L7.9等待从一个内存分区中分配内存OS_EVENTOS_EVENT voidmain{INT8U ..SemaphorePtr= PartitionPtr=OSMemCreate(Partition,100,32, .OSTaskCreate(Task,(void*)0,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论