我正在尝试编译嵌入式C代码,但会发生小数据区溢出。我知道这意味着什么,但我不知道如何解决它。有人可以提出建议吗?
所以,问题是r13寄存器是sda的基指针,它是16位长。它被签名,因此它指向sda的中间,它可以用作偏移量来获取给定的变量值。
如果通过#pragma ghs startsda告诉变量放入sda,那么它将由sda_base + r13寻址,如果变量位于无法通过此基址+寄存器偏移量寻址的地址,则sda溢出据报道。
如何找到导致溢出的原因?如果我还没有地图文件,我不知道变量地址。
答案 0 :(得分:0)
您需要检查以查看编译器配置。编译器可以自动将数据放入.sda区域。我忘记了确切的标志,但您可以从.sda中排除大于特定大小的数据。例如,你可以说大于64位的东西不会进入sda。这样,您定义的大缓冲区不会浪费您的所有sda空间。
答案 1 :(得分:0)
请在此处查看我对前一个问题的回答:https://stackoverflow.com/a/12305862/1424877
基本上,您应该使用链接时-auto_sda
而不是编译时#pragma ghs startsda
;如果链接器(elxr)可以为您执行SDA化,则后者不是非常有用,如果所有.o文件一起总计在SDA部分中放置超过64K,则可能导致链接器错误。
Green Hills的链接器可以自动“SDAize”编译器分配给.data
的数据;但无法自动“解SDAize”编译器已分配给.sdata
的数据。 (至少,它不能在2011年,我怀疑自2014年以来发生了变化。)