微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ucos-ii学习笔记——动态内存分配原理及使用

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

时间:11-28 来源:互联网 点击:

LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1>>

LCD_Write_COM(0x00,0x53);LCD_Write_DATA(y2>>

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_SIZE-1],3);//创建任务

OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE-1],4);

OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE-1],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次后才释放所申请的内存块

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top