【问题标题】:Green Hills Sw small data area overflow [duplicate]Green Hills Sw 小数据区溢出 [重复]
【发布时间】:2014-04-08 16:59:26
【问题描述】:

我正在尝试编译嵌入式 C 代码,但发生小数据区溢出。我知道这是什么意思,但我不知道如何解决它。谁能给个建议?

所以,问题在于 r13 寄存器是 sda 的基指针,它是 16 位长。它是有符号的,所以它指向sda的中间,它可以作为一个偏移量来获取给定的变量值。

如果一个变量被#pragma ghs startsda 告知要放到sda 中,那么它将被sda_base+r13 寻址,如果变量的地址不能被这个base+register 偏移寻址,那么sda 溢出被举报了。

如何找到导致溢出的原因?如果我没有地图文件,但我不知道变量地址。

【问题讨论】:

    标签: c embedded powerpc greenhills


    【解决方案1】:

    在此处查看我对先前问题的回答:https://stackoverflow.com/a/12305862/1424877

    基本上,您应该使用链接时 -auto_sda 而不是编译时 #pragma ghs startsda;如果链接器 (elxr) 可以为您进行 SDA 化,则后者不是很有用,并且如果您的所有 .o 文件加在一起在 SDA 部分中超过 64K,则可能导致链接器错误。

    Green Hills 的链接器可以自动“SDAize”编译器分配给.data 的数据;但它不能自动“de-SDAize”编译器已经分配给.sdata 的数据。 (至少在 2011 年不能,我怀疑到 2014 年这种情况发生了变化。)

    【讨论】:

      【解决方案2】:

      您需要检查一下您的编译器配置。编译器可以自动将数据放入 .sda 区域。我忘记了确切的标志,但您可以从 .sda 中排除大于特定大小的数据。例如,您可以说大于 64 位的内容不进入 sda。这样,您定义的大缓冲区不会浪费您所有的 sda 空间。

      【讨论】:

        猜你喜欢
        • 2015-01-08
        • 2011-02-16
        • 2012-11-30
        • 2010-11-11
        • 1970-01-01
        • 2011-08-09
        • 2011-12-24
        • 2014-01-12
        相关资源
        最近更新 更多