ucos-ii学习笔记——动态内存分配原理及使用
(2012-10-09 11:15:51)
标签:
ucos-ii操作系统程序设计嵌入式 |
分类: 学习探讨 |
ucos-ii学习笔记——动态内存分配原理及使用
Created
学习笔记
for
redesigned
2012-10-8
versions:V-0.1
All
#include
#define
OS_STK
OS_STK
OS_MEM
//内存分区时,返回值就是它
INT8U
INT8U
char
//char
//char
INT8U
INT8U
void
void
void
{
}
void
{
#if
#endif
}
void
{
#if
#endif
pdata=pdata;
for(
{
IntBlkPtr=OSMemGet(IntBuffer,&err);
//函数的参数为指向内存分区的指针,上面已经创建了内存分区IntBuffer
//函数的返回值为内存块指针,上面定义了
*IntBlkPtr=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);
}
}
//上面程序中*++IntBlkPtr=2;
#include
#define
OS_STK
OS_STK
OS_STK
OS_STK
char
char
char
char
INT8U
INT8U
INT8U
OS_MEM
INT8U
INT8U
OS_MEM_DATA
//查询到的动态内存分区状态的信息
//的有关信息就放在这个数据结构中
void
void
void
void
void
{
}
void
{
#if
#endif
}
void
{
#if
#endif
pdata=pdata;
for(
{
PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
IntBlkPtr=OSMemGet(
&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);
if(Times>=5)
{
OSMemPut(
IntBuffer,
IntBlkPtr
//此次释放,只能释放最后一次申请到的内存块,前面因为IntBlkPtr被后面的给覆盖掉了,所以释放
//不了。
);
}
Times++;
OSTimeDlyHMSM(0,0,1,0);
}
}
void
{
#if
#endif
pdata=pdata;
for(
{
PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
IntBlkPtr=OSMemGet(
&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);
}
}
void
{
#if
#endif
pdata=pdata;
for(
{
PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);
IntBlkPtr=OSMemGet(
&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);
}
}
//根据上面的分析可以很容易分析运行的现象了,从现象中可以看出,任务YouTask和HerTask申请了内存块使用完了
//后就释放了,而任务MyTask要一直到运行了6次后才释放所申请的内存块