2010-12-10 105 views
1

我想這個說法(if語句的主體中)是原子的:有沒有一種方法可以確保C中的操作的原子性?

if(I2C1STATbits.P || cmd_buffer_ptr >= CMD_BUFFER_SIZE - 1) 
    cmd_buff_full = 1; // should be atomic 

我處理器(頁dsPIC33F)支持原子位設置和清除。它還支持16位寄存器和內存位置的原子寫入;這些都是單一循環。我如何確定操作將以原子方式實現 - 是否有辦法強制編譯器執行此操作?在我的情況下,我相當肯定它會被編譯爲原子,但是如果我改變了一些其他的代碼並重新編譯了一些東西,或者我更新了編譯器,我不希望它在將來發生變化。例如,是否有atomic關鍵字?

我正在使用GCC v3.23 - 更具體地說,MPLAB C30,一個修改後的GCC閉源版本。我正在研究一種只有中斷的微控制器;沒有線程的概念。原子性唯一可能的問題是,如果可能的話,在兩個週期的寫入過程中可能會觸發中斷。

回答

3

根據您希望賦值爲原子的其他競爭操作,可以使用sig_atomic_t。嚴格來說,這隻能保護信號。實際上,它也提供了原子性。多threeading。

編輯:如果對象是保證存儲操作不編碼爲兩個彙編指令,就必須要使用內聯彙編 - C的溫度將不作任何保證在這方面。如果目標是防止中斷干擾存儲操作,另一種方法是在存儲之前禁用中斷,然後再啓用它們。

+0

我不確定我的微控制器庫是否提供了這個功能。 – 2010-12-10 21:40:19

+0

所以你應該檢查它是否。 – 2010-12-10 21:43:15

+0

我不這麼認爲。它不支持信號或線程。 – 2010-12-11 01:09:47

0

不在C中,但可能在處理器附帶的庫中存在專有的庫調用。例如,在Windows上,有一個InterlockedIncrement()和InterlockedDecrement()(以增加/減少長),保證它們是原子而不鎖定的。

+0

我不認爲我的微控制器有一個。我的變量是16位的,所以我認爲它是原子的,但我想確定一些優化不會改變這一點。 – 2010-12-10 21:27:10

相關問題