首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPARC LEON错误: IU异常(tt = 0x2B,数据存储错误)

SPARC LEON错误: IU异常(tt = 0x2B,数据存储错误)
EN

Stack Overflow用户
提问于 2018-01-18 18:56:24
回答 1查看 733关注 0票数 0

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

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

代码语言:javascript
复制
#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;

}

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

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

以下是grmon控制台的输出:

代码语言:javascript
复制
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位,所以我就这么做了。但程序仍然会崩溃。这里出了什么问题?

提前感谢您的耐心等待。

-Lorenzo

EN

回答 1

Stack Overflow用户

发布于 2018-01-24 23:48:58

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

然后,您最终可以将程序加载到RAM中(从grmon使用" load ")。

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

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

洛伦佐。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48319640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档