2013-02-02 29 views
2

我正在爲Cortex M0(ARM)CPU編寫代碼,而32位讀/寫是原子的。現在我想知道什麼時候我讀/寫8位/ 16位變量,他們也保證是原子嗎?我的直覺說是的,因爲它們內部對齊到32位段,所以CPU不可能需要兩條單獨的指令來讀/寫它們。包裝結構中的變量是否可以自動讀取?

但我也碰巧在壓縮結構中存儲了很多變量以節省內存,並且在那裏有可能變量沒有在32位邊界上對齊,所以16位值的每一半可能不同部分。

因此,當我使用打包結構時,我失去原子操作是真的嗎?

+1

您從未保證過原子操作。 http://stackoverflow.com/questions/1790204/in-c-is-i-1-atomic?rq=1 –

+0

一個實現不僅包含硬件,還包括操作系統,編譯器和標準庫。正如你已經標記「gcc」,我會假設你正在使用一個操作系統。哪些文檔告訴你原子性?關於「原子」的定義,您的硬件是否與您的操作系統,gcc和libgcc一致?您的硬件如何處理來自同一核心上運行的不同軟件線程的讀/寫操作? – Sebivor

+0

@Anonymous你的假設對於C來說一般是正確的。但是給定一個特定的CPU和編譯器,你可能對操作原子性有更好的瞭解。現在這將推動完全不可移植的代碼。 – greydet

回答

1

使用壓縮結構,您將永遠不會在與內存單元邊界重疊的字段上讀取/寫入原子操作。這意味着只有8位操作保證是原子操作,否則它取決於你的字段的內存對齊。

+0

考慮一個沒有任何併發​​概念的獨立實現。 – Sebivor

+3

@modifiablelvalue所以呢?沒有併發並不意味着原子性。 – greydet

+0

@modifiablelvalue,即使你沒有線程,你也可以有信號和信號處理程序。 –

相關問題