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

📄 test_sdram_64bit.c

📁 测试cpu性能的代码
💻 C
字号:
/*++
* 摘要:
*    针对SDRAM的测试程序。
*
* 版本日期:
*    
*
* 修改:
*
*
--*/
#include <stdio.h>
#include <std.h>
#include <mem.h>
#include <sys.h>
#include <csl_stdinc.h>
#include "DP1000_led.h"
#include "test_sdram.h"

Ptr bufRead;
extern Int L2SRAM;

/*++

Description:

    向Memroy存储区填充数据。

Arguments:

    IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000(128M)
    
    IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000

    IN double val,输入的要填充的数据值,有效值范围double型

Return Value:

    0,正确;
    -1,错误。
--*/
Int16 
MEM_fill(
    Uint32 start, 
    Uint32 len, 
    Uint32 n
    )
{
    Uint32 i, j, end;
    Uint32 *valP;
    double valStart = 0x33333333;
    double val1 = 0x55555555;
    double val2 = 0xAAAAAAAA;
    double value;
    
    /* Calculate end of range */
    end = start + len;
    
    *(Uint32*)start = valStart;
    *(Uint32*)(start + 4) = valStart;
    valStart = *((double *)start); 
    
    *(Uint32*)start = val1;
    *(Uint32*)(start + 4) = val1;
    val1 = *((double *)start);
    
    *(Uint32*)start = val2;
    *(Uint32*)(start + 4) = val2;
    val2 = *((double *)start);    
    
    /* Fill a range with start value */
    for (i = start; i < end; i+=8)
    {
        *((double *)i) = valStart;
    }  
   
//    printf("start MEM_inverse() \n");
    /* Fill a range with a value */
    for (i = start; i < end; i+=16)
    {
        *((double *)i) = val1;
        *((double *)(i + sizeof(val1))) = val2;//VAL2
    }      
    // Verify the data one by one
    for (i = start; i < end; i+=(sizeof(val1) + sizeof(val2)))
    {
        value = *(double*)i;
        if(value != val1)
        {
        	valP = (Uint32*)&value;
        	printf("SigErr:blog =%4d, addr=0x%X, value = 0x%X %X \n", n, i, *(valP + 1), *valP);
            return -1;
        }    
        value = *(double*)(i+sizeof(val1));
        if(value != val2)
        {
            valP = (Uint32*)&value;
        	printf("SigErr:blog =%4d, addr=0x%X, value = 0x%X %X \n", n, (i + sizeof(val1)), *(valP + 1), *valP);
            return -1;
        } 
    }
//    printf("     start reading and verifying data section by section... \n");
    // Verify the data section by section, section size is NUM_READ
    for (i = start; i < end;)
    {
        memset(bufRead, 0, 0x8000);
        // read one section continuously   
        for(j = 0; j < NUM_READ; i += 8, j += 8)
        {
           *(double*)((Uint32)bufRead + j) = *((double *)i);
        }
        //verify this section 
        for(j = 0; j < NUM_READ; j += 16)
        {
            value = *(double*)((Uint32)bufRead + j);
	        if(value != val1)
	        {
	            valP = (Uint32*)&value;
	        	printf("SecErr:blog =%4d, addr=0x%8X, value = 0x%X %X\n", n, (i - NUM_READ + j), *(valP + 1), *valP);
	            return -1;
	        }    
	        
	        value = *(double*)((Uint32)bufRead + j + sizeof(val1));
	        if(value != val2)
	        {
	            valP = (Uint32*)&value;
	        	printf("SecErr:blog =%4d, addr=0x%8X, value = 0x%X %X\n", n, (i - NUM_READ + j + 8), *(valP + 1), *valP);
	            return -1;
	        } 
        }
    }  
    return 0;
}
/*++

Description:

    将Memroy先写入0x5555 5555 5555 5555,然后检测是否正确,
          然后写入0xAAAA AAAA AAAA AAAA,然后检测是否正确。

Arguments:

    IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000
    
    IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000

Return Value:

    0,正确;
    -1,错误。
--*/
Int16 
MEM_reverse(
    Uint32 start, 
    Uint32 len
    )
{
    Uint32 i, j, end;
    double val1 = 0x55555555;
    double val2 = 0xAAAAAAAA;

    /* Calculate end of range */
    end = start + len;
    
    *(Uint32*)start = val1;
    *(Uint32*)(start + 4) = val1;
    val1 = *((double *)start);
    
    *(Uint32*)start = val2;
    *(Uint32*)(start + 4) = val2;
    val2 = *((double *)start);    

//    printf("start MEM_inverse() \n");

/* Fill a range with a value */
    for (i = start; i < end; i+=16)
    {
        *((double *)i) = val1;
        *((double *)(i + sizeof(val1))) = val2;
    }      
    // Verify the data one by one
    for (i = start; i < end; i+=(sizeof(val1) + sizeof(val2)))
    {
        if(*(double*)i != val1)
        {
        	printf("Reverse ERROR: addr=%#x, value = %#x \n", i, *(double*)i);
            return -1;
        }    
        if(*(double*)(i+sizeof(val1)) != val2)
        {
        	printf("Reverse ERROR: addr=%#x, value = %#x \n", (i + 8), *(double*)(i + 8));
            return -1;
        } 
    }
 //   printf("     start reading and verifying data section by section... \n");
    // Verify the data section by section, section size is NUM_READ
    for (i = start; i < end;)
    {
        memset(bufRead, 0, 0x8000);
        // read one section continuously   
        for(j = 0; j < NUM_READ; i += 8, j += 8)
        {
           *(double*)((Uint32)bufRead + j) = *((double *)i);
        }
        //verify this section 
        for(j = 0; j < NUM_READ; j += 16)
        {
	        if(*(double*)((Uint32)bufRead + j) != val1)
	        {
	        	printf("Reverse ERROR: addr=%#x, value = %#x \n", (i - NUM_READ + j), *(double*)(i - NUM_READ + j));
	            return -1;
	        }    
	        if(*(double*)((Uint32)bufRead + j + sizeof(val1)) != val2)
	        {
	        	printf("Reverse ERROR: addr=%#x, value = %#x \n", (i - NUM_READ + j + 8), *(double*)(i - NUM_READ + j + 8));
	            return -1;
	        } 
        }
    }  
    
    return 0;



}
/*++

Description:

    向Memroy进行逐位检查。

Arguments:

    IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000
    
    IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000

Return Value:

    0,正确;
    -1,错误。
--*/
Int16 
MEM_walking(
    Uint32 start, 
    Uint32 len
    )
{
    Uint32 i,j;
    Uint32 mask;
    Uint32 end = start + len;
//    printf("start MEM_walking() \n");
	for (i = start; i < end; i+=4)
    {
	    /* Walking ones and zeros */
	    mask = 1;
	    for (j = 0; j < 32; j++)
	    {
	        /* Test one in bit position i */
	        *((Uint32 *)i) = mask;
	        if (*((Uint32 *)i) != mask)/* Check data */
	        {
	            printf("Bit ERROR: addr=%#x, value = %#x \n", i, *((Uint32 *)i));
	            return -1;
	        }   
	        /* Test zero in bit position i */
	        *((Uint32 *)i) = ~mask;
	        if(*((Uint32 *)i) != (~mask))/* Check data */
	        {
	            printf("Bit ERROR: addr=%#x, value = %#x \n", i, *((Uint32 *)i));
	            return -1;
	        }   
	        mask = mask << 1;
	    }
    }
    return 0;
}
/*++

Description:

    将MEM分成区域来检测。

Arguments:

    IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000
    
    IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000

Return Value:

    0,正确;
    -1,错误。
--*/

Int16 MEM_fill_test(start, len)
{
    Int16 status = 0;
    Int16 numBlog;
    Int16 i;
        
    Uint32 blogAddr;
//    printf("start MEM_fill_test() \n");
    /* Check external memory (byte 0x80000000 to byte 0x88000000) */
//-----------------------------------------------------------------------    
    numBlog = len / BLOG_LEN;
    
    for(i = 0; i < numBlog; i++)
    {
        blogAddr = start + i * BLOG_LEN;
    	status |= MEM_fill(blogAddr, BLOG_LEN, i);
    }
//    printf("all %d blogs test finished! \n", numBlog);
//-----------------------------------------------------------------------  

    return status;
}
/*++

Description:

    所有的MEM测试程序。

Arguments:

    IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000
    
    IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000

Return Value:

    0,正确;
    -1,错误。
--*/

Int16 MEM_test(Uint32 start, Uint32 len)
{
    Int16 status = 0;
    
    status |= MEM_fill_test(start, len);
    status |= MEM_reverse(start, len);
//    status |= MEM_walking(start, len);       
    return status;
}
/*++

Description:

    SDRAM测试程序调用程序。

Arguments:


Return Value:

    0,正确;
    -1,错误。
--*/

Int16 TEST_sdram()
{
    Int16 status = 0;
    
    if((bufRead = MEM_alloc(L2SRAM, NUM_READ, 128)) == MEM_ILLEGAL)
	{
        printf("MEM_alloc failture!\n");
        return SYS_EALLOC;
    } 
    /* Check external memory (byte 0x80000000 to byte 0x88000000) */
    status |= MEM_test(SDRAM_START_ADDR, SDRAM_LEN);
    MEM_free(L2SRAM, bufRead, NUM_READ);
    if(status)
    {
        return -1;
    }
    else
    {
	    REG32(DP1000_LED_REG_ON) = 0x02;
	    return 0;
    }    
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -