⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memory.c

📁 windows mobile 6.13 dnldr下载源码
💻 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 + -