DRAM test code

本文详细阐述了内存测试的过程,通过使用特定的测试模式填充内存,并进行详细检查,确保内存的正确性和稳定性。此过程涉及内存分配、数据填充、模式验证等多个步骤,旨在确保系统的可靠性和数据安全性。
#include <stdio.h>
#include <stdlib.h>

#define LEVEL 5
#define RAM_TEST_PATTERNS 2


int
main (int argc, char *argv[])
{
    ulong *ptrMalloc = NULL;
    int i = 0, j = 0;
    ulong test_value;
    ulong *ptrl = NULL;
    int level = 0;


/*
    for ( i = 0; i < 10000; i++) {
        fprintf(stderr," i = %d\n", i);
        ptrMalloc = (char*) malloc(1024 * 1024 * i);
        if (!ptrMalloc) {
            fprintf(stderr,"malloc %d failed\n", i);
            break;
        }
        free(ptrMalloc);
    }
*/

    static const ulong TestPattern[LEVEL][RAM_TEST_PATTERNS] = { 
        {0xFFFFFFFF, 0x00000000},
        {0x55555555, 0xAAAAAAAA},
        {0xA5A5A5A5, 0x5A5A5A5A},
        {0x96969696, 0x69696969},
        {0xCCCCCCCC, 0x33333333}
    };  



    ptrMalloc = (ulong*) malloc(1024 * 1024 * 20 * sizeof(ulong));
    if (!ptrMalloc) {
        fprintf(stderr,"malloc failed\n");
        return -1;
    }

    level = 0;
    for(i = 0; i < RAM_TEST_PATTERNS; i++) {
        test_value = TestPattern[level][i];

        /* Fill Test Pattern */
        for (ptrl = ptrMalloc, j = 0; j < 1024 * 1024 * 20; j++, ptrl++) {
            *ptrl = test_value;
            /*debug*/
            //fprintf(stdout,"Fill test Pattern 0x%x\n",*ptrl);
            //fprintf(stdout,"DRAM Test at address 0x%p\n",ptrl);
        }

        /* Check Test Pattern */
        for (ptrl = ptrMalloc, j = 0; j < 1024 * 1024 * 20 ; j++, ptrl++) {
            if (*ptrl != test_value) {
                printf(" ...FAIL\n");
                printf("DRAM Test Fail at address 0x%p, read:0x%x, should:0x%x\n", ptrl, *ptrl, test_value );
                return 1;
            }
        }


    }




    return 0;
}
<think>好的,我需要回答用户关于U-Boot在启动过程中从SRAM切换到DRAM的原因和时机的问题。首先,我得回忆一下U-Boot的基本启动流程。通常,嵌入式系统上电后,CPU会从固化在ROM中的启动代码开始执行,然后加载U-Boot到SRAM中运行。因为SRAM速度快,不需要初始化,但容量小,所以U-Boot在初始阶段只能使用SRAM。接下来,U-Boot需要初始化DRAM控制器,配置时序参数,这样才能使用更大容量的DRAM。这时候就得切换到DRAM,否则无法加载更大的内核或进行更多操作。用户提到的SRAM切换DRAM的原因可能包括SRAM容量限制和性能需求。DRAM虽然速度慢一些,但容量大,成本低,适合作为主存。而切换的时机应该是在U-Boot完成DRAM初始化之后,将自身代码重定位到DRAM中,并继续执行后续的引导流程。需要确认U-Boot的具体步骤,比如初始硬件、设置栈指针、初始化DRAM控制器、代码重定位等。可能还需要解释为什么不能一开始就用DRAM,因为DRAM需要初始化才能使用,而初始化过程本身需要在SRAM中运行的代码来完成。此外,要提到重定位的过程,包括复制代码到DRAM并跳转执行。还要考虑用户可能对SRAM和DRAM的区别不太清楚,需要简要说明两者的特点,比如SRAM快速、无需刷新,但集成度低;DRAM容量大,但需要刷新和初始化。引用中提到的SDRAM和DDR SDRAM的区别也可能相关,比如同步和双数据率的特点。最后,生成相关问题时要围绕U-Boot的启动流程、存储器管理、优化方法等,确保问题有助于用户深入理解。需要确保回答结构清晰,分点说明原因和时机,并引用相关的知识,比如提到的SDRAM特性和cache的作用,但要注意用户的问题主要关注存储器的切换机制,而非缓存。</think>### U-Boot运行流程中SRAM切换DRAM的机制 #### 1. **U-Boot启动流程概述** 嵌入式系统上电后,CPU首先执行固化在ROM中的引导代码(如BootROM),随后将U-Boot加载到SRAM中运行。U-Boot的初始阶段需在SRAM中完成关键硬件初始化,包括时钟、GPIO和DRAM控制器配置。**DRAM初始化完成后**,U-Boot会将自身代码重定位到DRAM中继续执行后续任务(如加载操作系统内核)[^1][^2]。 #### 2. **SRAM切换DRAM的原因** - **容量限制**:SRAM集成度低,通常仅几十KB至几MB,无法容纳完整的U-Boot功能(如文件系统支持、网络协议栈等)。 - **性能需求**:虽然SRAM访问速度快(无刷新延迟),但DRAM容量更大(几十MB至GB级),可支持内核加载、内存映射等操作。 - **成本因素**:DRAM单位成本远低于SRAM,适合作为主存储器[^1]。 #### 3. **切换时机** - **硬件初始化完成后**:在SRAM中完成CPU时钟、DRAM控制器初始化后(如配置时序参数`tRCD`、`tRP`等),U-Boot通过内存测试验证DRAM可用性。 - **重定位阶段**:通过`relocate_code`函数将自身代码从SRAM复制到DRAM的目标地址(如`0x80000000`),并跳转到DRAM中的入口继续执行。 - **环境变量加载前**:重定位后,U-Boot才能加载存储在外部Flash中的环境变量或扩展功能模块[^2]。 #### 4. **关键代码示例(简化流程)** ```c // 初始化DRAM控制器 void dram_init() { configure_ddr_timing(); // 配置时序参数 perform_memory_test(); // 验证DRAM稳定性 } // 重定位代码到DRAM void relocate_code(ulong addr) { memcpy((void *)addr, _start, _end - _start); asm volatile("ldr pc, =%0" : : "r"(addr)); } ``` #### 5. **与SRAM/DRAM特性关联** - **SRAM优势**:无需初始化,访问延迟低(约10ns),适合存放早期引导代码。 - **DRAM依赖初始化**:需配置刷新周期(如SDRAM的`tREF`)和行/列地址延迟,否则无法稳定存取数据[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值