您的位置 首页 数字

ucos-ii学习笔记——动态内存分配原理及运用

Createdon:2012-10-8Author:zhangbin学习笔记forucos-iiPCredesignedbyzhangbin2012-10-8versions:V-01AllRight

Createdon:2012-10-8

Author:zhangbin

学习笔记

forucos-iiPC

redesignedbyzhangbin

2012-10-8

versions:V-0.1

AllRightsReserved

#include“INCLUDES.h”

#defineTASK_STK_SIZE512

OS_STKStartTaskStk[TASK_STK_SIZE];

OS_STKMyTaskStk[TASK_STK_SIZE];

OS_MEM*IntBuffer;//界说内存操控块指针,也便是指向内存分区的指针,创立一个

//内存分区时,返回值便是它OS_MEM内存操控块类型的指针

INT8UIntPart[50][64];//区分一个具有50个内存块,每个内存块长度是64个字节的内存分区

INT8U*IntBlkPtr;//界说内存块指针无符号char型的

char*s1=“Mytaskisrunning”;

//char*s2=“Youtaskisrunning”;

//char*s3=“Hertaskisrunning”;

INT8Uerr;//寄存错误信息

INT8Uy=0;//字符显现方位

voidStartTask(void*data);

voidMyTask(void*data);

voidmain(void)

{

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS,OSCtxSw);

IntBuffer=OSMemCreate(IntPart,50,64,&err);//创立动态内存函数参数为:IntPart为内存分区的开始地址

//前面现已界说了INT8UIntPart[50][64];表明内存分区,用数组名表明开始地址

//第二个参数50表明分区中内存块的数目,第三个参数64表明每个内存块的字节数,最终&err为错误信息

//上面也界说了INT8Uerr;//寄存错误信息

//函数的返回值为创立的内存分区的指针,为OS_MEM内存操控块类型的指针,上面界说了

//OS_MEM*IntBuffer;//界说内存操控块指针

OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE1],0);//创立开始使命

OSStart();

}

voidStartTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

INT16Skey;

pdata=pdata;

OS_ENTER_CRITICAL();

PC_VectSet(0x08,OSTickISR);

PC_SetTickRate(OS_TICKS_PER_SEC);

OS_EXIT_CRITICAL();

OSStatInit();

OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE1],3);//创立使命MyTask

for(;;)

{

//假如恩下ESC键,则退出UC/OS-II

if(PC_GetKey(&key)==TRUE)

{

if(key==0x1B)

{

PC_DOSReturn();

}

}

OSTimeDlyHMSM(0,0,3,0);

}

}

voidMyTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

IntBlkPtr=OSMemGet(IntBuffer,&err);//恳求内存块从现已树立的内存分区中恳求一个内存块

//函数的参数为指向内存分区的指针,上面现已创立了内存分区IntBuffer

//函数的返回值为内存块指针,上面界说了INT8U*IntBlkPtr;//界说内存块指针无符号char型的

*IntBlkPtr=1;//在恳求到的内存块中存入1

//留意,应用程序在运用内存块时,有必要知道内存块的巨细,并且在运用时不能超过该容量

PC_DispStr(*IntBlkPtr*10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);//显现信息

*++IntBlkPtr=2;//???

PC_DispStr(*IntBlkPtr*10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);

IntBlkPtr–;//???

OSMemPut(IntBuffer,IntBlkPtr);//开释内存块当应用程序不再运用这个内存块后,有必要及时把它开释,

//从头放入相应的内存分区中

//函数中的第一个参数IntBuffer为内存块所属的内存分区的指针,IntBlkPtr为待开释内存块指针

//在运用函数OSMemPut()开释内存块时,一定要保证把该内存块开释到它本来所属的内存分区中

//不然会引起灾难性的结果

OSTimeDlyHMSM(0,0,1,0);//等候1s

}

}

//上面程序中*++IntBlkPtr=2;//???和IntBlkPtr–;//???的意思和效果还没有搞清楚

#include“INCLUDES.h”

#defineTASK_STK_SIZE512

OS_STKStartTaskStk[TASK_STK_SIZE];

OS_STKMyTaskStk[TASK_STK_SIZE];

OS_STKYouTaskStk[TASK_STK_SIZE];

OS_STKHerTaskStk[TASK_STK_SIZE];

char*s;

char*s1=“Mytask“;

char*s2=“Youtask“;

char*s3=“Hertask“;

INT8Uerr;//错误信息

INT8Uy=0;//字符显现方位

INT8UTimes=0;

OS_MEM*IntBuffer;//界说内存操控块指针,创立一个内存分区时,返回值便是它

INT8UIntPart[8][6];//区分一个具有8个内存块,每个内存块长度是6个字节的内存分区

INT8U*IntBlkPtr;//界说内存块指针INT8U型的

OS_MEM_DATAMemInfo;//寄存内存分区的状况信息该数据结构寄存查询动态内存分区状况函数OSMemQuery()

//查询到的动态内存分区状况的信息是一个SO_MEM_DATA型的数据结构OSMemQuery()函数查询到的内存分区

//的有关信息就放在这个数据结构中

voidStartTask(void*data);

voidMyTask(void*data);

voidYouTask(void*data);

voidHerTask(void*data);

voidmain(void)

{

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS,OSCtxSw);

IntBuffer=OSMemCreate(IntPart,8,6,&err);//创立动态内存区

OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE1],0);//创立开始函数

OSStart();

}

voidStartTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

INT16Skey;

pdata=pdata;

OS_ENTER_CRITICAL();

PC_VectSet(0x08,OSTickISR);

PC_SetTickRate(OS_TICKS_PER_SEC);

OS_EXIT_CRITICAL();

OSStatInit();

OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE1],3);//创立使命

OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE1],4);

OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE1],5);

for(;;)

{

//假如恩下ESC键,则退出UC/OS-II

if(PC_GetKey(&key)==TRUE)

{

if(key==0x1B)

{

PC_DOSReturn();

}

}

OSTimeDlyHMSM(0,0,3,0);

}

}

voidMyTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);//显现信息

IntBlkPtr=OSMemGet(//恳求内存块

IntBuffer,//内存分区的指针

&err);//错误信息

OSMemQuery(//查询内存操控块信息

IntBuffer,//带查询内存操控块指针

&MemInfo);

sprintf(s,”%0x”,MemInfo.OSFreeList);//显现头指针把得到的闲暇内存块链表首地址的指针放到指针s所指的空间中

PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);//把闲暇内存块链表首地址的指针显现出来

sprintf(s,”%d”,MemInfo.OSNUsed);//显现已用的内存块数目

PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

if(Times>=5)//运转六次后

{

OSMemPut(//开释内存块函数

IntBuffer,//内存块所属内存分区的指针

IntBlkPtr//待开释内存块指针

//此次开释,只能开释最终一次恳求到的内存块,前面由于IntBlkPtr被后边的给掩盖掉了,所以开释

//不了。

);

}

Times++;//运转次数加1

OSTimeDlyHMSM(0,0,1,0);//等候1s

}

}

voidYouTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);

IntBlkPtr=OSMemGet(//恳求内存块

IntBuffer,//内存分区的指针

&err);//错误信息

OSMemQuery(//查询内存操控块信息

IntBuffer,//待查询内存操控块指针

&MemInfo);

sprintf(s,”%0x”,MemInfo.OSFreeList);//显现头指针

PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

sprintf(s,”%d”,MemInfo.OSNUsed);//显现已用的内存块数目

PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

OSMemPut(//开释内存块

IntBuffer,//内存块所属内存分区的指针

IntBlkPtr//待开释内存块指针

);

OSTimeDlyHMSM(0,0,2,0);//等候2s

}

}

voidHerTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);

IntBlkPtr=OSMemGet(//恳求内存块

IntBuffer,//内存分区的指针

&err);//错误信息

OSMemQuery(//查询内存操控块信息

IntBuffer,//待查询内存操控块指针

&MemInfo);

sprintf(s,”%0x”,MemInfo.OSFreeList);//显现头指针

PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

sprintf(s,”%d”,MemInfo.OSNUsed);//显现已用的内存块数目

PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

OSMemPut(

IntBuffer,//内存块所属内存分区的指针

IntBlkPtr//待开释内存块指针

);

OSTimeDlyHMSM(0,0,1,0);//等候1s

}

}

//依据上面的剖析能够很简单剖析运转的现象了,从现象中能够看出,使命YouTask和HerTask恳求了内存块运用完了

//后就开释了,而使命MyTask要一直到运转了6次后才开释所恳求的内存块

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/256259.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部