早上好,我需要帮助,因为我被卡住了,在手册中找不到任何解决方案。
我想在EDAC
上使用Leon3
。我正在使用BCC编译器在C中进行编程。特别是我有一个GR-UT699板。我正在使用GRMON将我的elf文件刷新到RAM中。我的程序是我要使用EDAC
的简短测试。为了启用EDAC
,我以这种方式简单地对寄存器进行位bang(可以说我检查了寄存器并正确写入了它们):
#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
之前,程序崩溃。我认为它在初始化函数返回期间崩溃。这些是
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
我看到我需要在
IE
reg中设置MCFG1
位,所以我做到了。但是程序仍然崩溃。怎么了预先感谢您的耐心配合。
-洛伦佐
最佳答案
我发现至少一种解决方案不会导致程序崩溃。
如果要使用EDAC,则必须初始化内存控制器寄存器(从GRMON中使用“ mcfgx 0xvalue等”或启动GRMON时使用-edac选项进行初始化)。
然后将执行RAM的清洗(使用GRMON的清洗命令)。
在启用EDAC之后,启动清洗命令(或通常从固件清洗存储器)很重要。实际上,如果在启用ENAC之后清洗内存,则会生成校验位。否则,您将执行简单的内存清理。
然后,您最终可以将程序加载到RAM中(使用“ load”从grmon中加载)。
重要的是要注意,复位时还应清除IU / FPU寄存器,这可以通过MKPROM完成(如有必要)。
该解决方案适用于通过GRMON加载到RAM中的程序。
如果有必要将程序刷新到闪存ROM中,则应通过MKPROM执行类似的操作。我还没有做到这一点,但我希望是真的很相似。
洛伦佐
关于c - SPARC LEON错误:IU异常(tt = 0x2B,数据存储错误),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48319640/