2012-12-14 64 views
0

我正在研究16位微控制器的一些C代碼。當我在目標上調試應用程序時,最終會碰到AddressError ISR。我閱讀了數據手冊,它說如果您嘗試讀取或寫入對齊到奇數內存地址的16位值,就會發生這種情況。我想我理解這意味着什麼,但這看起來不對。並不意味着如果我要做出這樣的結構:什麼導致16位體系結構上的地址錯誤?

struct foo{ 
    uint8_t thing1; 
    uint16_t thing2; 
}; 

我永遠不會讀或寫入thing2沒有錯誤?如果不是,那麼這是否意味着編譯器會自動在事物1和事物2之間填充8位,以使事物2在偶地址上正確對齊?如果是這種情況,那麼地址錯誤將如何發生?

+4

您可能需要在問題中添加更多詳細信息。但請檢查編譯器中的對齊以確保它對齊到16位。通過對齊上面的結構可以工作。 – PeterJ

+0

檢查處理器手冊,查看哪些地址是合法的。然後檢查你的鏈接器命令文件。 – anishsane

回答

0

大多數小尺寸處理器只允許有限的一組內存操作,因爲未對齊的內存讀取將不得不在兩個或更多個週期內完成並增加了處理器的總體複雜度。

這通常不會在c代碼中顯示,因爲堆棧變量和結構成員都與類型的本地寬度(或4或8個字節,以最小者爲準)對齊。這可以用屬性打包覆蓋,以及將指向結構的指針重新分配給未對齊的地址。因此,人們可以很容易地熟悉地址錯位異常。

雖然例如。英特爾8086在非對齊地址處支持16位讀取,但在嘗試訪問字跨越段邊界(偏移量爲0xffff)時,仍然可以選擇地址生成異常。

0

可能你需要改變默認的結構對齊。您可以在代碼或編譯器選項中使用編譯指示。在GCC的情況下,它是-fpack-結構[= N]

0

您可以根據自己實例化這個:

struct foo{ 
    uint8_t thing1; 
    uint16_t thing2; 
}; 

可以對齊在偶數地址,但如果編譯器是不是足夠聰明就不會有添加填充因此事物2之間的事物2在奇數地點之間因此錯誤。要麼更改成員順序,要麼搜索編譯器文檔(可能會使用一些編譯指示預處理器指令),以便編譯器幫助您爲您調整數據。

相關問題