1

我正在尝试编译嵌入式 C 代码,但发生小数据区溢出。我知道这是什么意思,但我不知道如何解决它。任何人都可以提出建议吗?

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

如果一个变量被 #pragma ghs startsda 告知要放入 sda,那么它将由 sda_base+r13 寻址,如果该变量位于该基址+寄存器偏移量无法寻址的地址,则报告 sda 溢出。

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

4

2 回答 2

0

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

于 2014-04-24T17:57:45.383 回答
0

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

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

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

于 2014-05-23T19:12:43.840 回答