gpt4 book ai didi

c - SPARC LEON 错误 : IU exception (tt = 0x2B, 数据存储错误)

转载 作者:行者123 更新时间:2023-11-30 16:36:41 25 4
gpt4 key购买 nike

早上好,我需要帮助,因为我陷入困境,并且在查看手册时找不到任何解决方案。

我想在 Leon3 上使用 EDAC。我正在使用 BCC 编译器进行 C 编程。特别是,我有一 block GR-UT699 板。我正在使用 GRMON 在 RAM 中刷新我的 elf 文件。我的程序是一个简短的测试,我想在其中使用 EDAC。为了启用 EDAC,我以这种方式简单地对寄存器进行了位操作(我可以说我检查了寄存器并且它们被正确写入):

#define MCFG2_RMW_bit_set   0x00000040  //enable read-modify-write cycles on sub-word writes to 16 and 32bit areas with common write strobe

#define MCFG2_DE_bit_set 0x00004000 //SDRAM controller (1 en, 0 dis)

#define MCFG3_R_bit_set 0x00000200 //enable EDAC checking of the SDRAM or SRAM (1 en, 0 dis)

#define MCFG1_IE_bit_set 0x00080000 //enable access to mapped I/O memory.

...

edac->MCFG1 = edac->MCFG1 | MCFG1_IE_bit_set;

edac->MCFG2 = edac->MCFG2 | MCFG2_RMW_bit_set | MCFG2_DE_bit_set;

edac->MCFG3 = edac->MCFG3 | MCFG3_R_bit_set;

...

return 0;

}

这些指令在返回 0 的 init 函数内执行。我只是设置了您在前面的定义中可以看到的位。

当函数返回时,我只想调用 printf() 来显示一条消息。后者(printf)输出永远不会显示。因此,程序在设置寄存器之后、printf 之前崩溃。我认为它在 init 函数返回期间崩溃了。

这些是 grmon 控制台输出:

grmon2> run

IU exception (tt = 0x2B, data store error)

0x40009acc: 81c3e008 retl <memmove+484>



grmon2> inst

TIME ADDRESS INSTRUCTION RESULT SYMBOL

2608062 40009978 andcc %g1, %g3, %g0 [00000000] memmove+0x90

2608065 4000997C be 0x40009AB0 [00000000] memmove+0x94

2608066 40009980 or %g2, %o1, %g1 [40013FA0] memmove+0x98

2608067 40009AB0 mov 0, %g1 [00000000] memmove+0x1c8

2608068 40009AB4 ldub [%o1 + %g1], %g3 [0000002E] memmove+0x1cc

2608070 40009AB8 stb %g3, [%g2 + %g1] [40012EA0 2E2E2E2E] memmove+0x1d0

2608072 40009ABC add %g1, 1, %g1 [00000001] memmove+0x1d4

2608073 40009AC0 cmp %g1, %o2 [00000000] memmove+0x1d8

2608076 40009AC4 bne,a 0x40009AB8 [00000000] memmove+0x1dc

2608078 40009ACC retl [ TRAP ] memmove+0x1e4

我发现我需要在 MCFG1 注册表中设置 IE 位,所以我就这样做了。但程序仍然崩溃。这里出了什么问题?

预先感谢您的耐心等待。

-洛伦佐

最佳答案

我找到了至少一种不会导致程序崩溃的解决方案。如果您想使用 EDAC,则必须初始化内存 Controller 寄存器(从 GRMON 使用“mcfgx 0xvalue 等”或在启动 GRMON 时使用 -edac 选项)。然后应执行 RAM 清洗(使用 GRMON 的清洗命令)。在启用 EDAC 后,启动清洗命令(或者通常从固件中清洗内存)非常重要。事实上,如果在启用 ENAC 后清洗内存,则会生成检查位。否则,您将执行简单的内存清理。

然后您终于可以将程序加载到 RAM 中(从 grmon 使用“load”)。

值得注意的是,IU/FPU 寄存器也应在复位时清除,这可以从 MKPROM 完成(如果需要)。

此解决方案适用于通过 GRMON 加载到 RAM 中的程序。如果需要将程序闪存到闪存 ROM 中,则应通过 MKPROM 执行类似的操作。我还没有这样做,但我希望是真正类似的东西。

洛伦佐。

关于c - SPARC LEON 错误 : IU exception (tt = 0x2B, 数据存储错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48319640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com