uboot 中内存测试,内存检测方法

2023-11-04

DDR内存子系统常见硬件错误及Uboot中检测流程

在 U-Boot中,Denx(U-Boot的开发商)针对常见的DDR内存故障进行了严格的检测处理,下图描述了该检测处理过程的三个步骤:检测数据线、地址线和DDR物理存储部件,主要涉及这三个步骤的处理过程和方法,对于DDR子系统,是很容易出故障并且是很难debug检测出来的,而Denx所针对 DDR内存故障设计的检测方法是非常严谨,值得学习研究的。

下面主要是相关的检测处理思路及问题:

1、为什么先检测数据线?

因为如果数据线是断开的,那么一切无从谈起!接下来是检测地址线,只有数据线和地址线都通过,检测内存的存储单元才有意义,这样的流程也利于分割定位问题。上面testing sequence框图将整个检测过程分成三大步,用三个虚线方框表示。

2、数据线的连接错误

数据线的连接可能存在两种错误,一种是被断开,另一种布线或生产造成互相短路。

3、如何检测数据线的连接错误

Denx 设计的数据线检测算法还是很Tricky和精秒的,整个处理流程如下例子:如果是两根数据线,只需要写入并读出一个pattern=0b01(0b开头表示二进制数)就能判断它们是否短路或断开。很明显,大部分的嵌入式平台不止两根数据线,我们以64位地址线为例,pattern = 0b101010101010101010.... 能检测出奇偶位之间的数据错误。如果这个错误被排除,每两根数据线组成一组(这是理解下一个pattern的关键),再用相同的办法,检测每相邻两组之间是否有短路,就得到第二个pattern,就是 0b110011001100...... 依次类推,以4根数据线为一组,8根线为一组,相继得到共6个pattern,分别是 0xaaaaaaaaaaaaaaaa,0xcccccccccccccccc,0xf0f0f0f0f0f0f0f0,0xff00ff00ff00ff00,0xffff0000ffff0000,0xffffffff00000000。只要相继写入并读出这6个pattern就能验证是否存在数据线交叉短路错误。

4、如何检测数据线与板上其它信号线交叉短路或断路

取以上6个paatern的反码,总共12个pattern就能检测到每一位都可以写入和读出0和1。

5、什么是floating buses错误

floating buses会“欺骗”测试软件,如果测试软件写入并很快读出一个值的时候,写操作会跟数据线上的电容充电,总线会短暂的保持它的状态。当测试软件读操作时,总线会返回刚写入的值,即使实际上该数据线是断路的。

6、如何检测数据线的floating buses错误

检测floating buses错误的算法不复杂,在写入和读回之间再插入一次对不同地址写入不同值的操作。例如,X写入X1位置,Y写入Y1位置,再从X1位置读出X值则表示floating buses错误不存在。

7、地址线的错误

如果地址线存在错误,其症状是地址空间中的两个不同位置被映射到同一物理存储位置。更通俗地讲,就是写一个位置却“改变”了另一个位置。

8、地址线的错误检测

地址线的错误检测相对简单,其算法是:

1)、将地址的值作为内容写入该地址处,汇编的表示方法是 (addr) = addr。即将地址值写到地址对应的空间里,这样确保每一个位置的内容不同。

2)、依次将内存基地址的某一根地址线的值翻转(flip/toggle)得到某个地址,从该地址取值,如果该值和基地址的值相等,则表示某一位地址线有问题。

这个算法的特点是每次只检测一根地址线,方法简单有效。

9、存储单元的错误

以上数据线和地址线的检测都是检测布线或工厂生产的错误,而存储单元的检测则是真正对DDR内存芯片的检测。内存芯片的常见错误是bit-stuck,简而言之,就是让它是0,它偏为1,让它为1,它偏为0,检测方法也很简单,就是用不同的pattern去写尽可能所有的地址并读回比较。有一些常用的 pattern如0x5555, 0xAAAA等。

10、几个简单的检测DDR故障的方法

上面的DDR检测算法,虽然全面,但是耗时比较长,常常需要好几个小时,在Uboot命令行下也有几个简单的命令可以检测常见内存故障,如下所示:

1)、mtest addr lenth pattern

这个命令需要注意,DDR在Uboot启动后被映射到了0地址,但是uboot的代码和堆、栈空间0x10000000处开始,这些空间是不能被刷的,否则就挂死了。

2)、复制NOR flash的内容到内存中,如 cp.b 0x20080000 0x7fc0 20000,然后比较 cmp.b 0x20080000 0x7fc0 20000。

3)、下载kernel image到内存中,copy NOR flash 或tftp都行,然后调用iminfo LOAD_ADDR 检测CRC错误。

第一种方法是用特定的pattern去刷DDR的空闲空间,第二种和第三种方法可以说Pattern的随机性更大一些。

当然最彻底的检测方法当然是长时间跑Linux系统,上面的方法更适用于系统不稳定时定位错误。

内存检测方法
2011年07月14日 星期四 20:59

内存检测方法

针对常见的DDR内存故障进行了严格的检测处理,下图描述了该检测处理过程的三个步骤:检测数据线、地址线和DDR物理存储部件,主要涉及这三个步骤的处理过程和方法。

下面主要是相关的检测处理思路及问题:

1、为什么先检测数据线?

因为如果数据线是断开的,那么一切无从谈起!接下来是检测地址线,只有数据线和地址线都通过,检测内存的存储单元才有意义,这样的流程也利于分割定位问题。上面testing sequence框图将整个检测过程分成三大步,用三个虚线方框表示。

2、数据线的连接错误

数据线的连接可能存在两种错误,一种是被断开,另一种布线或生产造成互相短路。

3、如何检测数据线的连接错误

Denx 设计的数据线检测算法还是很Tricky和精秒的,整个处理流程如下例子:如果是两根数据线,只需要写入并读出一个pattern=0b01(0b开头表示二进制数)就能判断它们是否短路或断开。很明显,大部分的嵌入式平台不止两根数据线,我们以64位地址线为例,pattern= 0b101010101010101010.... 能检测出奇偶位之间的数据错误。如果这个错误被排除,每两根数据线组成一组(这是理解下一个pattern的关键),再用相同的办法,检测每相邻两组之间是否有短路,就得到第二个pattern,就是0b110011001100...... 依次类推,以4根数据线为一组,8根线为一组,相继得到共6个pattern,分别是0xaaaaaaaaaaaaaaaa,0xcccccccccccccccc,0xf0f0f0f0f0f0f0f0,0xff00ff00ff00ff00,0xffff0000ffff0000,0xffffffff00000000。只要相继写入并读出这6个pattern就能验证是否存在数据线交叉短路错误。

4、如何检测数据线与板上其它信号线交叉短路或断路

取以上6个pattern的反码,总共12个pattern就能检测到每一位都可以写入和读出0和1。

5、什么是floating buses错误

floating buses会“欺骗”测试软件,如果测试软件写入并很快读出一个值的时候,写操作会对数据线上的电容充电,总线会短暂的保持它的状态。当测试软件进行读操作时,总线会返回刚写入的值,即使实际上该数据线是断路的。

6、如何检测数据线的floating buses错误

检测floating buses错误的算法不复杂,在写入和读回之间再插入一次对不同地址写入不同值的操作。例如,a写入A位置,b写入B位置,再从A位置读出a值则表示floating buses错误不存在。

7、地址线的错误

如果地址线存在错误,其症状是地址空间中的两个不同位置被映射到同一物理存储位置。更通俗地讲,就是写一个位置却“改变”了另一个位置。

8、地址线的错误检测

地址线的错误检测相对简单,其算法是:

1)将地址的值作为内容写入该地址处,汇编的表示方法是*addr = addr。即将地址值写到地址对应的空间里,这样确保每一个位置的内容不同。

2)依次将内存基地址的某一根地址线的值翻转(flip/toggle)得到某个地址,从该地址取值,如果该值和基地址的值相等,则表示某一位地址线有问题。

这个算法的特点是每次只检测一根地址线,方法简单有效。

9、存储单元的错误

以上数据线和地址线的检测都是检测布线或工厂生产的错误,而存储单元的检测则是真正对DDR内存芯片的检测。内存芯片的常见错误是bit-stuck,简而言之,就是让它是0,它偏为1,让它为1,它偏为0,检测方法也很简单,就是用不同的pattern去写尽可能所有的地址并读回比较。有一些常用的pattern如0x5555,0xAAAA等。

10、几个简单的检测DDR故障的方法

上面的DDR检测算法,虽然全面,但是耗时比较长,常常需要好几个小时,在Uboot命令行下也有几个简单的命令可以检测常见内存故障,如下所示:

1)mtest addr lenth pattern

这个命令需要注意,DDR在Uboot启动后被映射到了0地址,但是uboot的代码和堆、栈空间0x10000000处开始,这些空间是不能被刷的,否则就挂死了。

2)复制NOR flash的内容到内存中,如cp.b 0x20080000 0x7fc0 20000,然后比较cmp.b 0x20080000 0x7fc0 20000。

3)下载kernel image到内存中,copy NOR flash 或tftp都行,然后调用iminfo LOAD_ADDR 检测CRC错误。

第一种方法是用特定的pattern去刷DDR的空闲空间,第二种和第三种方法可以说Pattern的随机性更大一些。

当然最彻底的检测方法当然是长时间跑Linux系统,上面的方法更适用于系统不稳定时定位错误。

      具体代码实现如下:


static void move64(unsigned long long *src, unsigned long long *dest)

{

*dest = *src;

}

 

/*

 * This is 64 bit wide test patterns.  Note that they reside in ROM

 * (which presumably works) and the tests write them to RAM which may

 * not work.

 *

 * The "otherpattern" is written to drive the data bus to values other

 * than the test pattern.  This is for detecting floating bus lines.

 *

 */

const static unsigned long long pattern[] = {

0xaaaaaaaaaaaaaaaaULL,

0xccccccccccccccccULL,

0xf0f0f0f0f0f0f0f0ULL,

0xff00ff00ff00ff00ULL,

0xffff0000ffff0000ULL,

0xffffffff00000000ULL,

0x00000000ffffffffULL,

0x0000ffff0000ffffULL,

0x00ff00ff00ff00ffULL,

0x0f0f0f0f0f0f0f0fULL,

0x3333333333333333ULL,

0x5555555555555555ULL

};

const unsigned long long otherpattern = 0x0123456789abcdefULL;

 

/* 数据线检测 */

static int memory_post_dataline(unsigned long long * pmem)

{

unsigned long long temp64 = 0;

int num_patterns = sizeof(pattern)/ sizeof(pattern[0]);

int i;

unsigned int hi, lo, pathi, patlo;

int ret = 0;

 

for ( i = 0; i < num_patterns; i++) 

{

move64((unsigned long long *)&(pattern[i]), pmem++);

/*

* Put a different pattern on the data lines: otherwise they

* may float long enough to read back what we wrote.

*/

/* 预防floating buses错误 */

move64((unsigned long long *)&otherpattern, pmem--);

move64(pmem, &temp64);

 

#ifdef INJECT_DATA_ERRORS

temp64 ^= 0x00008000;

#endif

 

if (temp64 != pattern[i])

{

pathi = (pattern[i]>>32) & 0xffffffff;

patlo = pattern[i] & 0xffffffff;

 

hi = (temp64>>32) & 0xffffffff;

lo = temp64 & 0xffffffff;

 

post_log ("Memory (date line) error at %08x, "

 "wrote %08x%08x, read %08x%08x !\n",

 pmem, pathi, patlo, hi, lo);

ret = -1;

}

}

return ret;

}

 

/* 地址线检测 */

static int memory_post_addrline(ulong *testaddr, ulong *base, ulong size)

{

ulong *target;

ulong *end;

ulong readback;

ulong xor;

int   ret = 0;

 

end = (ulong *)((ulong)base + size);/* pointer arith! */

xor = 0;

for(xor = sizeof(ulong); xor > 0; xor <<= 1) 

{

/* 对测试的地址的某一根地址线的值翻转 */

target = (ulong *)((ulong)testaddr ^ xor);

if((target >= base) && (target < end)) 

{

/* 由于target是testaddr某一根地址线的值翻转得来

   故testaddr != target,下面赋值操作后

   应有*testaddr != *target */

*testaddr = ~*target;

readback  = *target;

 

#ifdef INJECT_ADDRESS_ERRORS

if(xor == 0x00008000) 

{

readback = *testaddr;

}

#endif

                     /* 出现此种情况只有testaddr == target,即某根地址线翻转无效 */

if(readback == *testaddr) 

{

post_log ("Memory (address line) error at %08x<->%08x, "

 "XOR value %08x !\n",

testaddr, target, xor);

ret = -1;

}

}

}

return ret;

}

 

static int memory_post_test1 (unsigned long start,

     unsigned long size,

     unsigned long val)

{

unsigned long i;

ulong *mem = (ulong *) start;

ulong readback;

int ret = 0;

 

for (i = 0; i < size / sizeof (ulong); i++) {

mem[i] = val;

if (i % 1024 == 0)

WATCHDOG_RESET ();

}

 

for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) {

readback = mem[i];

if (readback != val) {

post_log ("Memory error at %08x, "

 "wrote %08x, read %08x !\n",

 mem + i, val, readback);

 

ret = -1;

break;

}

if (i % 1024 == 0)

WATCHDOG_RESET ();

}

 

return ret;

}

 

static int memory_post_test2 (unsigned long start, unsigned long size)

{

unsigned long i;

ulong *mem = (ulong *) start;

ulong readback;

int ret = 0;

 

for (i = 0; i < size / sizeof (ulong); i++) {

mem[i] = 1 << (i % 32);

if (i % 1024 == 0)

WATCHDOG_RESET ();

}

 

for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) {

readback = mem[i];

if (readback != (1 << (i % 32))) {

post_log ("Memory error at %08x, "

 "wrote %08x, read %08x !\n",

 mem + i, 1 << (i % 32), readback);

 

ret = -1;

break;

}

if (i % 1024 == 0)

WATCHDOG_RESET ();

}

 

return ret;

}

 

static int memory_post_test3 (unsigned long start, unsigned long size)

{

unsigned long i;

ulong *mem = (ulong *) start;

ulong readback;

int ret = 0;

 

for (i = 0; i < size / sizeof (ulong); i++) {

mem[i] = i;

if (i % 1024 == 0)

WATCHDOG_RESET ();

}

 

for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) {

readback = mem[i];

if (readback != i) {

post_log ("Memory error at %08x, "

 "wrote %08x, read %08x !\n",

 mem + i, i, readback);

 

ret = -1;

break;

}

if (i % 1024 == 0)

WATCHDOG_RESET ();

}

 

return ret;

}

 

static int memory_post_test4 (unsigned long start, unsigned long size)

{

unsigned long i;

ulong *mem = (ulong *) start;

ulong readback;

int ret = 0;

 

for (i = 0; i < size / sizeof (ulong); i++) {

mem[i] = ~i;

if (i % 1024 == 0)

WATCHDOG_RESET ();

}

 

for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) {

readback = mem[i];

if (readback != ~i) {

post_log ("Memory error at %08x, "

 "wrote %08x, read %08x !\n",

 mem + i, ~i, readback);

 

ret = -1;

break;

}

if (i % 1024 == 0)

WATCHDOG_RESET ();

}

 

return ret;

}

 

static int memory_post_tests (unsigned long start, unsigned long size)

{

int ret = 0;

 

if (ret == 0)

ret = memory_post_dataline ((unsigned long long *)start);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_addrline ((ulong *)start, (ulong *)start, size);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_addrline ((ulong *)(start + size - 8),

   (ulong *)start, size);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_test1 (start, size, 0x00000000);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_test1 (start, size, 0xffffffff);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_test1 (start, size, 0x55555555);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_test1 (start, size, 0xaaaaaaaa);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_test2 (start, size);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_test3 (start, size);

WATCHDOG_RESET ();

if (ret == 0)

ret = memory_post_test4 (start, size);

WATCHDOG_RESET ();

 

return ret;

}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uboot 中内存测试,内存检测方法 的相关文章

  • 使用 Actionscript 3 连接到数据库 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找有关如何基于数据库在 Flash 中动态创建内容的建议 最初我想将数据库导出到 XML 文件并使用内置的 Actionscr
  • 为什么 ActionScript 中没有记录 drawRoundRectComplex() ?

    在研究actionscript 3的图形类时 我遇到了未记录的drawRoundRectComplex 方法 它是一个变种drawRoundRect 但有 8 个参数 最后四个是每个角的直径 x y 宽度 高度 左上 右上 左下 右下 ex
  • 在 AS3 中快速设置关键帧上的实例名称

    现在在 Flash CS3 及更高版本 使用 Actionscript 3 中 如果您在图层中的多个关键帧中使用相同的实例 并且您决定稍后分配或更改实例名称 则必须转到每个关键帧并设置实例名称 这是一个很大的麻烦 有没有更快或更好的方法来做
  • 如何在多个 HTML 页面上播放背景音频?

    是否有解决方案可以让背景音频 音乐在网站上的多个页面上播放 而无需在每个页面加载时重新启动 该网站当前使用框架集 但我正在寻找替代方案 如果不让整个网站都 AJAX 我认为框架是唯一的方法 如果您需要的话 这里有一个关于制作 ajax 站点
  • 当给定闪光角度和速度时,计算物体的轨迹

    我正在尝试从大炮中发射炮弹并使其遵循现实的路径 射击角度根据大炮的方向而变化 自动定向到鼠标指针 所以我想弄清楚的是 当给定角度和设定速度时 如何沿着抛物线路径移动炮弹 我读到 这可以在没有复杂的三角学的情况下完成 在高中时从未听过 并且可
  • 我应该将 FLV 文件放在哪里才能在本地 Red5 服务器上进行流式传输?

    我安装了最新的 Red5 服务器 但我不确定将 flv 文件放在哪里来进行流式传输 没有像我在网上找到的一些教程那样的 streams 或 ofla 目录 我应该将 flv 文件放在哪里来进行流式传输 Red5 附带了一些演示 但默认情况下
  • Chrome 更新阻止 Flash 自动播放 - 如何避免?

    我在 html 页面中嵌入了 YouTube 视频 我将 youtube iframe API 与 Flash 结合使用 在我的例子中 我无法使用 HTML5 视频 自上次 Google Chrome 更新以来 Chrome 会阻止自动播放
  • iPhone 上的 Flash(或 Silverlight)

    我对在 iPhone 上开发应用程序感兴趣 并且作为一名 NET 和 ActionScript 开发人员 我对 Objective C Cocoa Touch 编程的学习曲线有点害怕 我知道 Adob e 已经为 iPhone 准备好了 F
  • 流媒体视频文件?

    我需要流式传输 flv 文件 流媒体应该看起来像直播 我应该有一种方法可以更改目标文件 抱歉我的英语不好 如果 流式传输 的意思是 显示 Flash 视频剪辑 则 flv streaming 并不是真正的流式传输 而是正常的文件传输 即使文
  • 更改 AS3 中的 TextField 选择颜色

    如何更改 ActionScript 3 中 TextField 的选择 突出显示 颜色 我有一个输入文本字段 黑色背景上有白色文本 因此 选择是不可见的 这对于可用性来说非常糟糕 谢谢 另一种方法是使用文本布局框架 特别是使用 Select
  • Flex 与 ActionScript

    我正在尝试构建 实现一个 Flash 视频播放器来播放视频 我研究了 Flex 并仅使用 VideoElement 构建了一个基本应用程序 它在没有静态链接库的情况下编译为 41k 在链接库时编译为 300k 我生成了报告 但仍然不确定为什
  • Facebook 聊天在打开时隐藏 Flash 应用程序

    运行 Flash 应用程序时 如果我打开新的或现有的 Facebook 聊天窗口 我的 Flash 内容就会消失 我可以继续听到应用程序中播放的音乐 并且当我关闭 最小化 Facebook 聊天窗口时 我的 Flash 内容会重新出现 这是
  • 使用 Flash 在本地托管游戏?

    我只是找不到合适的谷歌搜索词 是否可以使用 Flash 或 Flash 兼容服务 来允许游戏中的玩家通过 Web 浏览器托管自己的游戏 使用自己的带宽 在某种程度上 从他们的计算机运行他们自己的游戏服务器 对于 Flash 浏览器内游戏 但
  • Flash 未在调试播放器中显示错误/堆栈跟踪(firefox/chrome/whatnot)

    我正在尝试调试在线默默地失败的应用程序 我 100 确定我正在运行 Flash 调试播放器 为了确保我不会丢失它 我故意抛出一个错误 但 Flash 在浏览器中没有显示任何 stracktrace 我快要失去它了 有什么线索吗 我正在 ch
  • 在 Flash Player 10 中打开 pdf

    我需要在 Flash Player 10 中打开 PDF 该 swf 不会在浏览器中运行 并且系统上不会有 adobe reader 程序 我需要知道是否可以在 Flash 播放器中打开 PDF 而无需以任何方式进行转换 我在谷歌上搜索了无
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • 在没有流媒体服务器的情况下在 Flash 中录制 h.264 视频?

    是否可以在不需要流媒体服务器 如 fms wowza red5 的情况下从 Flash Actionscript 相机 即网络摄像头 保存 h 264 视频 我还想从麦克风获取样本数据 并在客户端对其进行转码 以便用户可以录制 h 264
  • getElementById 无法在 的 Google Chrome 扩展中工作

    在我的 Google Chrome 扩展内容脚本中 我有以下内容 jQuery document ready function var player document getElementById player console log pl
  • 如何打开/关闭 iPhone 相机闪光灯 swift 2?

    我正在寻找如何打开 关闭 iPhone 的相机闪光灯 我发现了这个 IBAction func didTouchFlashButton sender AnyObject let avDevice AVCaptureDevice defaul
  • 使用 flash/flex 在客户端硬盘上下载/保存/写入文件

    我想知道如何下载 保存 写入文件我的服务器 to a 客户的计算机使用闪光灯或柔性 我正在寻找的示例可以在http www flexdownloads com http www flexdownloads com Sign up Sign

随机推荐

  • Compound Types: Enums and Structs___CH_10

    10 1 Introduction to program defined user defined types What are user defined program defined types Defining program def
  • ROS2 Humble如何使用串口驱动?(Serial)

    目录 1 串口库 Serial Library 简介 2 源码及主页 3 国内git仓库 ROS2 humble已测试可用 4 可能出现的问题
  • 抖音小程序怎么赚钱,都有哪些变现玩法技巧。

    流量 钱 在抖音小程序变现这个项目中不一定成立 A 第一个视频爆了100多万观看 连怼了一次爆到900万 照理说 那么大的曝光率 挂小程序应该赚很多钱 答 没有多少收益 为什么 因为A发的视频内容和挂的小程序不相关 爆的是搞笑的视频 而挂的
  • pikachu xss攻击模块 信息安全 xss漏洞 详细分析

    XSS攻击 跨站脚本漏洞测试流程 反射型xss get 反射型xss post 存储型xss 实例 xss钓鱼 DOM型xss Dom型xss x Xss盲打 Xss之过滤 Xss之htmlspecialchars Xss之href输出 X
  • 第四节:论文种类分类-学习笔记

    任务说明 学习主题 论文分类 数据建模任务 利用已有数据建模 对新论文进行类别分类 学习内容 使用论文标题完成类别分类 学习成果 学会文本分类的基本方法 TF IDF等 数据处理步骤 在原始arxiv论文中论文都有对应的类别 而论文类别是作
  • Python读取文本文件到数组

    支持的格式有txt dat csv mat等 读入的数据存为float类型 可以自定义数据之间的间隔符 可以自定义列数cols import numpy as np import linecache import os filename d
  • MinIO verify 接口敏感信息泄露漏洞分析(CVE-2023-28432)

    MinIO verify 接口敏感信息泄露漏洞 简介 漏洞描述 MinIO 是一种开源的对象存储服务 它兼容 Amazon S3 API 可以在私有云或公有云中使用 MinIO 是一种高性能 高可用性的分布式存储系统 它可以存储大量数据 并
  • 【转载】Java中将InputStream读取为String, 各种方法的性能对比

    Java中将InputStream读取为String 各种方法的性能对比 原文地址 http www cnblogs com milton p 6366916 html 如下 一共存在11种实现方式及其对应的性能测试结果 1 使用IOUti
  • 在wpf中利用异步lambda编程,模拟数据库连接,防止界面假死

    参考 图解C 第20章异步编程第五节程序 解决在wpf中连接数据库 界面假死问题 public partial class MainWindow Window private bool isConnected false public Ma
  • 山洪灾害监测预警系统解决方案

    一 方案背景 近几年我国频繁发生山洪灾害现象 造成大量的人员伤亡 使得洪涝灾害死亡总人数呈上升趋势 群死群伤事件时有发生 为了提高山洪灾害监测预警能力 加强灾害发生时的快速反应能力 我司研发出了山洪灾害监测预警系统设备 它具有技术先进 功能
  • 职工管理系统_201026(思路详解版-第四步修改职工)

    12 修改职工 功能描述 能够按照职工的编号对职工信息进行修改并保存 12 1 修改职工函数声明 在workerManager h中添加成员函数 void Mod Emp 修改职工 void Mod Emp 12 2 修改职工函数实现 在w
  • 使用PAM保障开发运营安全

    硬编码凭据和 DevOps 系统中缺乏凭据安全性是组织的巨大漏洞 以明文形式访问凭据的恶意内部人员可以在 IT 中建立和扩展其立足点 基础设施 构成巨大的数据被盗风险 什么是PAM 特权访问管理 PAM 是指一组 IT 安全管理原则 可帮助
  • Markdown 技能树(2):段落及强调

    Markdown 技能树 2 段落及强调 在 Markdown 中 段落是由一个以上相连接的行句组成 而一个以上的空行则会切分出不同的段落 一般的段落不需要用空白或换行缩排 空行的定义是显示上看起来像是空行 便会被视为空行 比如 若某一行只
  • 再谈Linux epoll惊群问题的原因和解决方案

    转自 https blog csdn net dog250 article details 80837278 缘起 近期排查了一个问题 epoll惊群的问题 起初我并不认为这是惊群导致 因为从现象上看 只是体现了CPU不均衡 一共fork了
  • linux批量修改文件编码格式(包含子目录)

    背景 项目工程文件编码格式有utf 8 也有gb2312 在通过Source Insight 4 0打开文件只能设置一种默认编码格式UTF 8 Windows ANSI GB2312 不能自动识别文件本身的编码格式 这就导致总有一部分文件打
  • 【转载】爬虫篇:获取数据——urllib库的基础知识(总结)

    注 本文章大部分代码的案例节选于 Python3网络爬虫开发实战 第2版 一 发出请求 1 urlopen方法 Python版本 3 6 coding utf 8 urlopen 方法的API urllib request urlopen
  • 深度解析shell脚本的命令的原理之cp

    cp 是 Unix 或 Linux 中的一个基本命令 用于复制文件或目录 以下是对这个命令的深度解析 基本操作 cp 命令的基本操作是将一个或多个源文件或目录复制到一个目标文件或目录 它通过读取源文件的内容 并将这些内容写入到目标文件来完成
  • 利用Caffe创建自己的lmdb数据集

    用Caffe进行模型训练时 除了用现有的公开数据集 如MNIST CIFAR等 有时候我们还需要创建自己的数据集进行训练 本篇博客讲的就是如何利用Caffe中的模块创建自己lmdb数据集 数据集准备 我们需要自己准备好带类别标签的图片数据
  • 架构设计(数据层)

    架构设计 数据层 关系数据库 关系数据库 需要事先定义表 读写数据时 表中字段不可动态变更 表中的每个行记录代表一个关系 1 海贼王 20 2 瓜田李下 20 表与表之间也可建立关联关系 一对一 一对多 多对一 多对多 关系型数据库进行读写
  • uboot 中内存测试,内存检测方法

    DDR内存子系统常见硬件错误及Uboot中检测流程 在 U Boot中 Denx U Boot的开发商 针对常见的DDR内存故障进行了严格的检测处理 下图描述了该检测处理过程的三个步骤 检测数据线 地址线和DDR物理存储部件 主要涉及这三个