【发布时间】:2018-01-18 10:56:23
【问题描述】:
早上好,我需要帮助,因为我被困住了,看手册找不到任何解决方案。
我想在Leon3 上使用EDAC。我正在使用 BCC 编译器在 C 中编程。特别是,我有一块 GR-UT699 板。我正在使用 GRMON 将我的 elf 文件闪存到 RAM 中。我的程序是一个简短的测试,我想在其中使用EDAC。为了启用EDAC,我以这种方式简单地对寄存器进行bitbang(我可以说我检查了寄存器并且它们被正确写入):
#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 reg 中设置IE 位,所以我这样做了。但程序仍然崩溃。这里有什么问题?
提前感谢您的耐心等待。
-洛伦佐
【问题讨论】: