Я занимался разработкой встроенного программного обеспечения для ОС RTOS на C и столкнулся с проблемой доступа к общим ресурсам из нескольких потоков. У меня две проблемы. Первый - установка и получение значения переменной состояния в конечном автомате. Ниже приведен заголовочный файл для 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-битной переменной на 32-битном MCU - это атомарная операция.
Вторая проблема касается чтения значения одного элемента массива, содержащего 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);
}
Спасибо за любые идеи.