簡體   English   中英

多線程嵌入式軟件中的原子操作

[英]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根本無法保證原子性。 如果您不信任反匯編,則可以選擇以下幾種方法:

  • C11 _Atomic
  • 編寫內聯匯編器。
  • 使用互斥或​​類似的同步機制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM