首页 > 编程语言 >memtest算法移植到uboot中---------下篇

memtest算法移植到uboot中---------下篇

时间:2025-01-09 17:31:05浏览次数:3  
标签:count memtest addr ++ return ul TEST uboot ---------

// memtest_boot.c

#include "memtest_boot.h"

// 简单的随机数生成器

static ul rand_seed = 1;

static ul simple_rand(void) {

    rand_seed = rand_seed * 1103515245 + 12345;

    return rand_seed;

}

// 比较两块内存区域

static int compare_regions(ulv *bufa, ulv *bufb, ul count) {

    ul i;

    ulv *p1 = bufa;

    ulv *p2 = bufb;

   

    for (i = 0; i < count; i++, p1++, p2++) {

        if (*p1 != *p2) {

            return TEST_FAIL;

        }

    }

    return TEST_SUCCESS;

}

// 地址线测试

int test_addr_lines(ulv *addr, ul count) {

    ul pattern = 1;

    ul j;

   

    for (j = 0; j < sizeof(ul) * 8; j++) {

        ulv *p = addr;

        ulv *p1 = (ulv *)(((ul)addr) + pattern);

       

        if (((ul)p1) < ((ul)addr) + count) {

            *p = 0;

            *p1 = ~0UL;

            if (*p != 0) {

                return TEST_FAIL;

            }

        }

        pattern = pattern << 1;

    }

    return TEST_SUCCESS;

}

// 随机值测试

int test_random_value(ulv *addr, ul count) {

    ul i;

    for (i = 0; i < count; i++) {

        ul pattern = simple_rand();

        *addr = pattern;

        if (*addr != pattern) {

            return TEST_FAIL;

        }

        addr++;

    }

    return TEST_SUCCESS;

}

// 固定位模式测试

int test_solid_bits(ulv *addr, ul count) {

    ul i;

   

    // 测试全1模式

    for (i = 0; i < count; i++) {

        *addr = ~0UL;

        if (*addr != ~0UL) {

            return TEST_FAIL;

        }

        addr++;

    }

   

    addr -= count;

   

    // 测试全0模式

    for (i = 0; i < count; i++) {

        *addr = 0;

        if (*addr != 0) {

            return TEST_FAIL;

        }

        addr++;

    }

   

    return TEST_SUCCESS;

}

// 棋盘模式测试

int test_checkerboard(ulv *addr, ul count) {

    ul i;

    ul pattern1 = 0x55555555;

    ul pattern2 = 0xAAAAAAAA;

   

    // 写入pattern1

    for (i = 0; i < count; i++) {

        *addr = pattern1;

        addr++;

    }

   

    addr -= count;

   

    // 验证pattern1

    for (i = 0; i < count; i++) {

        if (*addr != pattern1) {

            return TEST_FAIL;

        }

        addr++;

    }

   

    addr -= count;

   

    // 写入pattern2

    for (i = 0; i < count; i++) {

        *addr = pattern2;

        addr++;

    }

   

    addr -= count;

   

    // 验证pattern2

    for (i = 0; i < count; i++) {

        if (*addr != pattern2) {

            return TEST_FAIL;

        }

        addr++;

    }

   

    return TEST_SUCCESS;

}

// 行走1测试

int test_walking_one(ulv *addr, ul count) {

    ul pattern = 1;

    ul i, j;

   

    for (i = 0; i < sizeof(ul) * 8; i++) {

        for (j = 0; j < count; j++) {

            addr[j] = pattern;

            if (addr[j] != pattern) {

                return TEST_FAIL;

            }

        }

        pattern = pattern << 1;

    }

    return TEST_SUCCESS;

}

// 主测试函数

int do_memtest(void *start, ul size, ul test_mask) {

    ulv *addr = (ulv *)start;

    ul count = size / sizeof(ul);

    int result = TEST_SUCCESS;

   

    // 地址线测试

    if (test_mask & TEST_ADDR_LINE) {

        if (test_addr_lines(addr, size) != TEST_SUCCESS) {

            result |= TEST_ADDR_LINE;

        }

    }

   

    // 随机值测试

    if (test_mask & TEST_RANDOM) {

        if (test_random_value(addr, count) != TEST_SUCCESS) {

            result |= TEST_RANDOM;

        }

    }

   

    // 固定位模式测试

    if (test_mask & TEST_SOLID_BITS) {

        if (test_solid_bits(addr, count) != TEST_SUCCESS) {

            result |= TEST_SOLID_BITS;

        }

    }

   

    // 棋盘模式测试

    if (test_mask & TEST_CHECKER) {

        if (test_checkerboard(addr, count) != TEST_SUCCESS) {

            result |= TEST_CHECKER;

        }

    }

   

    // 行走1测试

    if (test_mask & TEST_WALKING_1) {

        if (test_walking_one(addr, count) != TEST_SUCCESS) {

            result |= TEST_WALKING_1;

        }

    }

   

    return result;

}

注意:头文件参考上篇

标签:count,memtest,addr,++,return,ul,TEST,uboot,---------
From: https://blog.csdn.net/u011608645/article/details/145037245

相关文章

  • Rubyer-WPF:打造优雅、精致的 WPF 用户界面
    在桌面应用开发领域,WPF(WindowsPresentationFoundation)凭借其强大的UI设计能力和丰富的功能,始终是开发者们青睐的工具之一。今天,我将为大家介绍一款专注于WPFUI设计的优秀项目——Rubyer-WPF,它将帮助开发者打造更加优雅、美观的用户界面。项目简介Rubyer-WPF 是由开发......
  • 发那科FANUC机器人A06B-0652-B212电机维修基本流程
    发那科FANUC机器人以其卓越的性能和可靠性赢得了广泛的认可。然而,就像其他任何机械设备一样,长时间的运行和复杂的工作环境都可能使伺服电机面临维修的需求。为了确保您的发那科FANUC机器人A06B-0652-B212电机始终保持在最佳状态,发那科伺服电机维修服务显得尤为重要。一、发那科FA......
  • 基于Simulink开发一个带有无源滤波器的单相全桥整流AC-DC变换器
    目录基于Simulink的无源滤波AC-DC变换器项目实例详细介绍1.项目背景2.系统架构2.1单相全桥整流电路2.2无源滤波器2.3系统框图3.模型设计3.1创建Simulink模型3.2仿真环境搭建3.3仿真结果分析4.无源滤波器设计与优化4.1LC滤波器设计4.2优化滤波器性能5......
  • UML建模语言中不同图之间可以进行一致性检验-表示怀疑
    在UML(统一建模语言)中,**不同图之间确实可以进行一致性检验**,包括对于活动图和用例图,尤其是两者之间关键元素的一致性验证。进行这样的验证的目的,是确保建模的不同视角之间具有共同的信息基础,从而保持模型的整体完整性和一致性。以下是针对活动图与用例图的一致性验证的一些关键......
  • 活动图一般都是high-level,很少用来描述用例模板中的流,对吧?-这次回答的还比较靠谱
    是的,从实践经验来看,**活动图通常用于高层次的流程建模**,更多关注的是某个用例的行为或业务逻辑整体,而不是详细到专门描述用例模板中的所有基本流(BasicFlow)或可选流(AlternativeFlow)。换句话说,活动图一般从更广阔的视角来描述用例的执行逻辑,而不是直接一一映射用例模板的流。......
  • 中考英语优秀范文-013 Computer in my life 电脑在我的生活中
    中考英语优秀范文-013Computerinmylife电脑在我的生活中1写作要求假设某中学生英文报开展关于计算机与学生生活的征文活动,请你根据下表所提示的要点,以Computerinmylife为题,用英语为该报写一篇短文,简述计算机在你生活中的用途,并就计算机对你生活的影响谈谈你的感受。2......
  • AIGC测试生成结果评估工具-BLEU
    一、准备数据候选译文:这是需要评估的机器翻译或文本摘要结果。参考译文:这是人工翻译或撰写的标准答案,用于与候选译文进行对比。通常,会有多个参考译文以提供更全面的评估。二、安装BLEU评估工具BLEU评估工具通常作为自然语言处理库(如NLTK、Moses等)的一部分提供。以下是通过NL......
  • springboot城乡居民医疗信息管理系统-计算机设计毕业源码70573
    目 录摘要Abstract绪论1.1 选题背景1.2研究内容1.3本文的组织结构2相关技术介绍2.1MySQL数据库2.2Java编程语言2.3SpringBoot框架介绍3 系统需求分析与设计3.1可行性分析3.1.1技术可行性分析3.1.2经济可行性分析3.1.3法律可行性分析......
  • 未来大气污染,CMIP6数据驱动WRF和WRF-Chem模式
     第六次国际耦合模式比较计划(CMIP6)基于不同的共享社会经济路径(SSP)及最新的人为排放趋势,预估了不同社会共享路径和温室气体排放情景下的未来气候变化趋势,这些结果为模拟预估未来气候变化背景下大气污染的演变趋势提供了可能。对模式比较计划的全球气候预估数据进行动力降尺度,结......
  • 富文本编辑器-WangEditor
    vue2+ WangEditor 引入WangEditornpminstallwangeditor--save富文本编辑器组件:WangEditor.vue<template><!--富文本编辑器组件--><div><divref="editor"style="text-align:left;"></div></d......