[英]Atomic operation in multithreaded embedded software
我正在用C開發基於RTOS的嵌入式軟件,並且遇到了有關從多個線程訪問共享資源的問題。 我有兩個問題。 第一個是在狀態機中設置並獲取狀態變量的值。 以下是StateMachine“對象”的頭文件:
typedef enum{
STATE_01,
STATE_02,
STATE_03,
STATE_04
}state_e;
// state machine instance
typedef struct{
state_e currState;
}StateMachine;
extern state_e GetState(StateMachine*);
extern void SetState(StateMachine*, state_e);
訪問方法的實現如下:
state_e GetState(StateMachine *sm){
return sm->currState;
}
void SetState(StateMachine *sm, state_e state){
sm->currState = state;
}
我的問題是我不確定是否應該使用互斥體來控制對狀態變量的訪問。 我的意思是在32位MCU上讀寫32位變量是原子操作。
第二個問題是讀取包含無符號32位整數的數組的一項的值,其中每個位存儲一個位變量的值。 再次在這里我不確定是否需要使用互斥鎖。 基於與上述相同的原因,我想不,但我想聽聽一些更有經驗的程序員的意見。 位數組“對象”的關聯頭文件:
typedef struct{
uint32_t BitsArray[NO_WORDS];
}BitsArray;
extern uint32_t GetWordValue(BitsArray*, uint8_t);
訪問方法的實現:
uint32_t GetWordValue(BitsArray *ba, uint8_t word){
return *(ba->BitsArray + word);
}
謝謝您的任何想法。
您的兩個問題確實是同一個問題。
除非您反匯編代碼並確認操作確實是一條指令 ,否則32位MCU毫無意義。 C代碼通常不是這種情況。
通常,您有2條或更多條指令,例如:“將堆棧中的值加載到寄存器中”,“用寄存器執行操作”,在這種情況下,您的MCU獲得多少位無關緊要。 您可以在兩條指令之間進行中斷或上下文切換。
即使您可以驗證機器代碼是原子的,也不一定是穩定的狀態。 更改代碼,添加更多變量,再次鏈接,突然之間以前是原子的代碼不再是原子的,反之亦然。
C根本無法保證原子性。 如果您不信任反匯編,則可以選擇以下幾種方法:
_Atomic
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.