memmng.c
来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 231 行
C
231 行
/****************************************************************************/
/* */
/* Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: MemMng.c */
/* MODULE NAME: 内存管理 */
/* DESCRIPTION: 本程序主要处理内存管理相关的函数 */
/* */
/* FUNCTIONS: */
/* MemMngInitialize 内存管理模块初始化 */
/* MemAlloc 申请用户空间内存 */
/* MemFree 释放用户空间内存 */
/* MemCheckStart 设置内存申请检测点 */
/* MemCheckEnd 检测内存申请情况 */
/* */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-04-10 创建 */
/****************************************************************************/
/* 包含所需头文件 */
#include "Base.h"
#ifdef WIN32
#include "plus\inc\dm_defs.h"
#endif
/*---------------- 全局变量 ----------------*/
NU_MEMORY_POOL g_mpCommMemPool;
#ifdef WIN32
void OutDebugStr_ToPcOutput(char *strPtr);
static UINT8 g_byMemMask = 0; // For Test
#endif
/****************************************************************************/
/* FUNCTION: BOOL MemMngInitialize(VOID) */
/* DESCRIPTION:内存管理模块初始化 */
/* INPUTS: NONE */
/* OUTPUTS: NONE */
/* RETURN: 初始化成功返回TRUE,否则返回FALSE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-04-10 创建 */
/****************************************************************************/
BOOL MemMngInitialize(VOID)
{
#ifdef WIN32
g_byMemMask = 0; // For Test
#endif
return TRUE;
}
/****************************************************************************/
/* FUNCTION: VOID *MemAlloc(UINT32 dwSize) */
/* DESCRIPTION:申请用户空间内存 */
/* INPUTS: dwSize - 要申请的内存大小 */
/* OUTPUTS: NONE */
/* RETURN: 申请到了则返回内存指针,否则返回NULL */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-04-10 创建 */
/****************************************************************************/
VOID *MemAlloc(UINT32 dwSize)
{
VOID *pAlloc;
if ( NU_Allocate_Memory(&g_mpCommMemPool, &pAlloc, dwSize, NU_NO_SUSPEND)
== NU_SUCCESS )
{
#ifdef WIN32 // For Test
DM_HEADER *pMemHeader;
pMemHeader = (DM_HEADER *) ((UINT32)pAlloc - DM_OVERHEAD);
pMemHeader->dm_padding[0] = g_byMemMask;
#endif // For Test end
return pAlloc;
}
return (VOID*)NULL;
}
/****************************************************************************/
/* FUNCTION: BOOL MemFree(VOID *pPtr) */
/* DESCRIPTION:释放用户空间内存 */
/* INPUTS: pPtr - 内存指针 */
/* OUTPUTS: NONE */
/* RETURN: 释放成功返回TRUE,否则返回FALSE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-04-10 创建 */
/****************************************************************************/
BOOL MemFree(VOID *pPtr)
{
if ( pPtr == NULL )
return TRUE;
if ( NU_Deallocate_Memory(pPtr) == NU_SUCCESS )
return TRUE;
return FALSE;
}
/****************************************************************************/
/* FUNCTION: void MemCheckStart(void) */
/* DESCRIPTION:设置内存申请检测点 */
/* INPUTS: NONE */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-04-10 创建 */
/****************************************************************************/
void MemCheckStart(void)
{
#ifdef WIN32
g_byMemMask++;
#endif
}
/****************************************************************************/
/* FUNCTION: void MemCheckEnd(void) */
/* DESCRIPTION:检测内存申请情况 */
/* INPUTS: NONE */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-04-10 创建 */
/****************************************************************************/
void MemCheckEnd(void)
{
#ifdef WIN32
OPTION opPreemptStatus;
opPreemptStatus = NU_Change_Preemption(NU_NO_PREEMPT);
if( g_byMemMask > 0 )
{
DM_HEADER *pMemHeader, *pMemNext;
int nNotFrees;
VOID *pFirstPtr;
VOID *pNextPtr;
DM_PCB* pool = (DM_PCB *)&g_mpCommMemPool;
nNotFrees = 0;
pMemHeader = pool->dm_memory_list;
pMemNext = pMemHeader;
do
{
if( !pMemNext->dm_memory_free &&
(pMemNext->dm_padding[0] == g_byMemMask) )
{
if( nNotFrees == 0 )
pFirstPtr = (UINT8*)pMemNext + DM_OVERHEAD;
if (nNotFrees == 1)
pNextPtr = (UINT8*)pMemNext + DM_OVERHEAD;
nNotFrees++;
}
pMemNext = pMemNext->dm_next_memory;
}while( pMemNext != pMemHeader );
if ( nNotFrees > 0 )
{ // 有未释放内存
UINT8 aTempBuff[50];
sprintf( aTempBuff, "有%d块内存未释放!", nNotFrees );
OutDebugStr_ToPcOutput(aTempBuff);
if( nNotFrees > 1 )
{
sprintf( aTempBuff, "第一块的指针为:0x%X\n", pFirstPtr );
OutDebugStr_ToPcOutput( aTempBuff );
sprintf( aTempBuff, "第二块的指针为:0x%X\n", pNextPtr );
OutDebugStr_ToPcOutput( aTempBuff );
}
else
{
sprintf( aTempBuff, "内存块的指针为:0x%X", pFirstPtr );
OutDebugStr_ToPcOutput( aTempBuff );
}
/// DennyHan changed to NU_Sleep;
while(1){NU_Sleep(100);}
}
g_byMemMask--;
}
NU_Change_Preemption(opPreemptStatus);
#endif
}
/****************************************************************************/
/* FUNCTION: UINT32 GetMemSize(void) */
/* DESCRIPTION:检测剩余内存大小,供调试用 */
/* INPUTS: NONE */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Bingle 2005-06-15 创建 */
/****************************************************************************/
UINT32 GetMemSize(void)
{
UINT32 dwFreeMem = 0;
#ifdef WIN32
OPTION opPreemptStatus;
opPreemptStatus = NU_Change_Preemption(NU_NO_PREEMPT);
{
DM_HEADER *pMemHeader, *pMemNext;
DM_PCB* pool = (DM_PCB *)&g_mpCommMemPool;
pMemHeader = pool->dm_memory_list;
pMemNext = pMemHeader;
do
{
if( pMemNext->dm_memory_free)
{
dwFreeMem += (((BYTE_PTR) (pMemNext -> dm_next_memory)) -
((BYTE_PTR) pMemNext)) - DM_OVERHEAD;
}
pMemNext = pMemNext->dm_next_memory;
}while( pMemNext != pMemHeader );
}
NU_Change_Preemption(opPreemptStatus);
#endif
return dwFreeMem;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?