multithreading嵌入式软件中的primefaces操作

我一直在用C开发基于RTOS的嵌入式软件,我遇到了几个线程共享资源访问的问题。 我有两个问题。 第一个是在状态机中设置和获取状态变量的值。 下面是StateMachine“object”的头文件:

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位变量是primefaces操作。

第二个问题涉及读取包含无符号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); } 

谢谢你的任何想法。

你的两个问题都是同样的问题。

除非您反汇编代码并validation操作确实是单个指令 ,否则32位MCU意味着什么。 C代码通常不是这种情况。

通常你有两个或更多的指令,如:“从堆栈加载值到寄存器”,“用寄存器做东西”,在这种情况下,你的MCU有多少位并不重要。 您可以在两条指令之间进行中断或上下文切换。

即使您可以validation机器代码是primefaces的,也不一定是稳定的状态。 对代码进行更改,添加更多变量,再次链接,突然之前primefaces代码不再是primefaces的,反之亦然。

C根本无法保证primefaces性。 如果您不信任反汇编,可以选择一些替代方案:

  • C11 _Atomic
  • 编写内联汇编程序。
  • 使用互斥锁或类似的同步机制。