【问题标题】:SPARC LEON error: IU exception (tt = 0x2B, data store error)SPARC LEON 错误:IU 异常(tt = 0x2B,数据存储错误)
【发布时间】: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 位,所以我这样做了。但程序仍然崩溃。这里有什么问题?

提前感谢您的耐心等待。

-洛伦佐

【问题讨论】:

    标签: c embedded firmware sparc


    【解决方案1】:

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

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

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

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

    洛伦佐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2023-03-06
      相关资源
      最近更新 更多