2014-03-06 33 views
1

我正在做一個嵌入式系統的項目,我在中斷時更改標誌變量'x_flag'。此標誌變量爲global,並在其他源文件中訪問以檢查事件的狀態。如何處理嵌入式系統中的標誌變量

我知道處理全局變量的麻煩,但我想問你如何在其他源文件中訪問'x_flag'的當前狀態?

回答

4

公開變量的正確方法是在擁有它的類中創建一個GetXFlagState()函數。這樣,業主階級仍然處於控制之中。

+2

+1爲正確的答案。其他一切都是混淆。其他源文件不需要直接訪問該標誌。當然,你必須在文件範圍內,在ISR所在的文件中聲明該標誌爲「static volatile」。但是沒有理由讓它成爲全球性的。 – Lundin

4

在C-文件,你可以定義它像

volatile int x_flag; 

void myISRFunction(void) 
{ 
    x_flag = 1; 
} 

而且在你的頭文件添加一個聲明

extern volatile int x_flag; 

然後你只需要包括來自其他C頭文件-file以便能夠訪問x_flag

但是,在訪問/修改標誌時,還應該禁用中斷。

#include "myISR.h" 

void someFunc() 
{ 
    int local_x_flag; 

    disableInterrupts(); 
    local_x_flag = x_flag; 
    x_flag = 0; 
    enableInterrupts(); 

    if (local_x_flag) 
    doSomething(); 
} 

注意,如果該標誌是一個真正的硬件寄存器,你可能需要更加小心,因爲禁用中斷將不會從改變標誌的值,並清除它明確可能會或可能不會停止硬件允許。在這種情況下,您需要仔細查看硬件文檔以找出什麼是和不是安全的(和/或與正在設計它的人談話,如果您正在與硬件工程師合作)。

+0

理想情況下,用於'x_flag'的數據類型在目標架構上應該是原子的。例如,8位系統上的int可能不是這種情況。但是,如果它僅用於值0和1,這可能並不重要,但不清楚'x_flag'是打算成爲單個標誌還是成爲一組標誌*位*。 – Clifford

+0

@Clifford我不明白爲什麼它應該是原子的,即使在一個字節中,你不能在許多平臺上以原子方式修改單個位。我不喜歡依賴於特定的CPU功能和編譯器輸出。所以我優先建立一個禁用/啓用中斷的原子塊 – jeb

+0

正如我所說的,在這種情況下,它並不重要。一般來說,共享內存是一個考慮因素。對於我關於位標誌的觀點,你有一個觀點,即簡單地說原子在讀寫修改的情況下是沒有幫助的。 – Clifford