[英]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.