早上好,我需要帮助,因为我被卡住了,在手册中找不到任何解决方案。

我想在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/

10-09 08:57