2010-12-10 106 views
1

我想这个说法(if语句的主体中)是原子的:有没有一种方法可以确保C中的操作的原子性?

if(I2C1STATbits.P || cmd_buffer_ptr >= CMD_BUFFER_SIZE - 1) 
    cmd_buff_full = 1; // should be atomic 

我处理器(页dsPIC33F)支持原子位设置和清除。它还支持16位寄存器和内存位置的原子写入;这些都是单一循环。我如何确定操作将以原子方式实现 - 是否有办法强制编译器执行此操作?在我的情况下,我相当肯定它会被编译为原子,但是如果我改变了一些其他的代码并重新编译了一些东西,或者我更新了编译器,我不希望它在将来发生变化。例如,是否有atomic关键字?

我正在使用GCC v3.23 - 更具体地说,MPLAB C30,一个修改后的GCC闭源版本。我正在研究一种只有中断的微控制器;没有线程的概念。原子性唯一可能的问题是,如果可能的话,在两个周期的写入过程中可能会触发中断。

回答

3

根据您希望赋值为原子的其他竞争操作,可以使用sig_atomic_t。严格来说,这只能保护信号。实际上,它也提供了原子性。多threeading。

编辑:如果对象是保证存储操作不编码为两个汇编指令,就必须要使用内联汇编 - C的温度将不作任何保证在这方面。如果目标是防止中断干扰存储操作,另一种方法是在存储之前禁用中断,然后再启用它们。

+0

我不确定我的微控制器库是否提供了这个功能。 – 2010-12-10 21:40:19

+0

所以你应该检查它是否。 – 2010-12-10 21:43:15

+0

我不这么认为。它不支持信号或线程。 – 2010-12-11 01:09:47

0

不在C中,但可能在处理器附带的库中存在专有的库调用。例如,在Windows上,有一个InterlockedIncrement()和InterlockedDecrement()(以增加/减少长),保证它们是原子而不锁定的。

+0

我不认为我的微控制器有一个。我的变量是16位的,所以我认为它是原子的,但我想确定一些优化不会改变这一点。 – 2010-12-10 21:27:10

相关问题