2014-03-06 19 views
1

我想編譯嵌入式C代碼,但是發生小數據區溢出。我知道這是什麼意思,但我不知道如何解決它。任何人都可以提出建議嗎?Green Hills Sw小數據區溢出

所以,問題是有r13寄存器是sda的基址指針,它是16位長。它是有符號的,所以它指向sda的中間,它可以用作偏移量來獲得給定的變量值。

如果通過#pragma ghs startsda將變量告訴sda,那麼將通過sda_base + r13尋址變量,如果變量位於無法通過此基址+寄存器偏移量尋址的地址,則sda報告溢出。

如何找到導致溢出的原因?如果我還沒有地圖文件,我不知道變量地址。

回答

0

您需要檢查以查看您的編譯器配置。編譯器可以自動將數據放入.sda區域。我忘記了確切的標誌,但您可以從.sda中排除大於特定大小的數據。例如,你可以說超過64位的東西不會進入sda。這樣你定義的一個大緩衝區不會浪費你的所有sda空間。

0

見我的回答較早的問題在這裏:https://stackoverflow.com/a/12305862/1424877

基本上,你應該用鏈接時-auto_sda,而不是編譯時#pragma ghs startsda;如果鏈接器(elxr)可以爲您執行SDAization,則後者不是非常有用,並且如果所有的.o文件總計在一起將超過64K放在SDA部分中,它可能會導致鏈接器錯誤。

Green Hills的鏈接器可以自動「SDAize」編譯器分配給.data的數據;但不能自動「解除SDAize」編譯器已分配給.sdata的數據。 (至少,它不能在2011年,我懷疑這是截至2014年的變化。)