📄 memory.c
字号:
/*******************************************************************************
* Copyright: Copyright (c) 2007. Hisilicon Technologies, CO., LTD.
* Version: V300R001B04
* Filename: Memory.c
* Description: 实现内存控制功能
* History:
1.Created by SunShaoJie on 2007/12/25
*******************************************************************************/
#include "sys.h"
#include "DbgLog.h"
#include "Memory.h"
#include <string.h>
#ifdef CHECK_SP_OVERFLOW
/*******************************************************************************
Function: CheckSpMem
Description: 检测SP空间未使用区域的大小(检测方法:在系统启动时,先将SP段全部填充
0xFFFFFFFF。待程序运行结束后,再检测SP段还有多大的空间保留为0xFFFFFFFF,
则说明SP段未使用的空间大小。当SP段不存在0xFFFFFFFF时,则说明SP段有可能
已经溢出,需要在设计时增大SP段空间。)
Input: dwBgnAddr: SP段的起始地址
Output: 无
Return: 无
Others: 无
*******************************************************************************/
void CheckSpMem(UINT32 dwBgnAddr)
{
UINT32 i, len = RAM_USED_LEN - (dwBgnAddr - RAM_BASE_ADDR);
UINT32 *pData = (UINT32 *)dwBgnAddr;
len >>= 2;
for(i=0; i<len; i++)
{
if (RAM_UNUSED_FILL != *pData++)
{
break;
}
}
DEBUGMSG(ZONE_FUNCTION, ("Mem Used %d Words, Unused %d Words\r\n", len-i, i));
}
#endif
#if 0
/*******************************************************************************
Function: memset
Description: 将指定的内存区域设置为指定的值
Input: pAddr: 指定的内存区域
value: 指定的值
length:指定的内存长度
Output: 无
Return: 无
Others: 无
*******************************************************************************/
void memset(void *pAddr, UINT8 value, UINT32 length)
{
UINT8 *pTemp=(UINT8 *)pAddr;
UINT32 i=0;
ASSERT((NULL!=pAddr), "memset: Input Param error")
for(i=0; i<length; i++)
{
*pTemp++ = value;
}
}
/*******************************************************************************
Function: memcpy
Description: 将指定的源内存区域拷贝到目标内存区域。(注意:当源内存与目标
内存有重叠时,源目标地址必须大于目标地址)
Input: pSour: 指定的源内存区域
pDes: 指定的目标内存区域
length:指定拷贝的长度
Output: 无
Return: 无
Others: 无
*******************************************************************************/
void memcpy(void *pDes, const void *pSour, UINT32 length)
{
ASSERT((NULL!=pDes)&&(NULL!=pSour), "memcpy: Input Param error")
while(length--)
{
*(UINT8 *)pDes++ = *(UINT8 *)pSour++;
}
}
/*******************************************************************************
Function: memcpyA4
Description: 将指定的源内存区域拷贝到目标内存区域。(注意:当源内存与目标
内存有重叠时,源目标地址必须大于目标地址),必须为4字节对齐
Input: pSour: 指定的源内存区域
pDes: 指定的目标内存区域
length:指定拷贝的长度
Output: 无
Return: 无
Others: 无
*******************************************************************************/
void memcpyA4(void *pDes, const void *pSour, UINT32 length)
{
UINT32 *pTmp1 = (UINT32 *)pDes;
const UINT32 *pTmp2 = (UINT32 *)pSour;
ASSERT((NULL!=pDes)&&(NULL!=pSour), "memcpyA4: Input Param error")
/*while(length--)
{
*(UINT32 *)pDes++ = *(UINT32 *)pSour++;
}*/
while(length--)
{
*pTmp1++ = *pTmp2++;
}
//OALMSG(1, ("memcpyA4: pDes %x : %x, pSour %x : %x\r\n", pDes, *(UINT32 *)pDes, pSour, *(UINT32 *)pSour));
}
/*******************************************************************************
Function: memcmp
Description: 将指定的源内存区域与目标内存区域比较。
Input: pSour: 指定的源内存区域
pDes: 指定的目标内存区域
length:指定比较的长度
Output: 无
Return: 无
Others: 无
*******************************************************************************/
INT32 memcmp(const void *pDes, const void *pSour, UINT32 length)
{
const UINT8 *pTemp1=(UINT8 *)pDes;
const UINT8 *pTemp2=(UINT8 *)pSour;
UINT32 i=0;
ASSERT((NULL!=pDes)&&(NULL!=pSour), "memcmp: Input Param error")
for(i=0; i<length; i++)
{
if(*pTemp1 > *pTemp2)
{
return 1;
}
else if(*pTemp1++ < *pTemp2++)
{
return -1;
}
}
return 0;
}
#endif
UINT32 g_dwMallocAddr = MALLOC_MEM_ADDR;
/*******************************************************************************
Function: MemAlloc
Description: 从内存动态资源区申请内存空间。
Input: dwLen: 申请的内存空间长度
Output: 无
Return: 申请的内存空间地址或NULL
Others: 无
*******************************************************************************/
void *MemAlloc(UINT32 dwLen)
{
void *pAddr = NULL;
if((g_dwMallocAddr+dwLen) < (MALLOC_MEM_ADDR+MALLOC_MEM_LEN))
{
pAddr = (void *)g_dwMallocAddr;
g_dwMallocAddr += dwLen;
/* 申请的内存区必须以4字节对齐 */
g_dwMallocAddr = (g_dwMallocAddr+3)&(~0x3);
}
DEBUGMSG(ZONE_FUNCTION, ("MemAlloc: length %d, g_MallocAddr 0x%x, pAddr 0x%x\r\n", dwLen, g_dwMallocAddr, pAddr));
return pAddr;
}
/*******************************************************************************
Function: MemCheck
Description: 检测内存动态资源区是否存在坏块。
Input: pAddr: 内存检查的初始地址值
dwLen: 需要检查内存的长度
Output: 无
Return: TRUE 不存在坏块
FALSE 存在坏块
Others: 无
*******************************************************************************/
BOOL MemCheck(UINT32 *pAddr, UINT32 dwLen)
{
UINT32 i=0;
UINT32 *pTmpAddr = pAddr;
/* 在内存中全部填充0xFF */
memset(pAddr, 0xFF, MALLOC_MEM_LEN);
/* 读取内存的值查看是否有不等于0xFF的内存区 */
for(i=0;i<(dwLen>>2);i++)
{
if(*pTmpAddr != 0xFFFFFFFF)
{
return FALSE;
}
*pTmpAddr++ = 0; /* 同时将内存区清零 */
}
pTmpAddr = pAddr;
/* 读取内存的值查看是否有不等于0的内存区 */
for(i=0;i<(dwLen>>2);i++)
{
if(*pTmpAddr != 0)
{
return FALSE;
}
*pTmpAddr++ = 0x55555555; /* 同时将内存区写成0x55 */
}
pTmpAddr = pAddr;
/* 读取内存的值查看是否有不等于0x55的内存区 */
for(i=0;i<(dwLen>>2);i++)
{
if(*pTmpAddr != 0x55555555)
{
return FALSE;
}
*pTmpAddr++ = 0xAAAAAAAA; /* 同时将内存区写成0xAA */
}
pTmpAddr = pAddr;
/* 读取内存的值查看是否有不等于0xAA的内存区 */
for(i=0;i<(dwLen>>2);i++)
{
if(*pTmpAddr != 0xAAAAAAAA)
{
return FALSE;
}
*pTmpAddr = (UINT32)pTmpAddr; /* 同时将内存区写成地址值 */
pTmpAddr++;
}
pTmpAddr = pAddr;
/* 读取内存的值查看是否有不等于地址值的内存区 */
for(i=0;i<(dwLen>>2);i++)
{
if(*pTmpAddr != (UINT32)pTmpAddr)
{
return FALSE;
}
*pTmpAddr = ~(UINT32)pTmpAddr; /* 同时将内存区写成地址取反值 */
pTmpAddr++;
}
pTmpAddr = pAddr;
/* 读取内存的值查看是否有不等于地址取反值的内存区 */
for(i=0;i<(dwLen>>2);i++)
{
if(*pTmpAddr != ~(UINT32)pTmpAddr)
{
return FALSE;
}
pTmpAddr++;
}
return TRUE;
}
/*******************************************************************************
Function: InitMem
Description: 初始化内存区域
Input: 无
Output: 无
Return: TRUE 初始化成功
FALSE 初始化失败
Others: 无
*******************************************************************************/
BOOL InitMem(void)
{
g_dwMallocAddr = MALLOC_MEM_ADDR;
//return MemCheck((UINT32 *)g_MallocAddr, MALLOC_MEM_LEN);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -