AVR:main()/ ISR干扰

时间:2019-01-23 19:16:25

标签: c interrupt avr i2c

我正在C中的ATmega168(从站)上使用I2C(使用avr-gcc进行编译),但这可能是关于中断的普遍问题。

在我的C程序中,我有一个类型为uint8_t i2c_buffer[32]的全局变量,用于存储一些传感器和配置数据。每当总线主机读取或写入从机时,I2C-ISR也会访问此阵列。 由于通信是通过硬件驱动的,因此中断会触发向ram(我的I2C缓冲区变量)的传输。

我知道,由于ISR和我的主例程之间的竞争状况,不小心从ISR和主例程访问变量都可能导致数据损坏,但是我不确定如何正确处理。 有人告诉我在main正在访问有问题的变量时禁用中断。 这样可以防止变量损坏,但是另一方面,这不会导致数据丢失吗? 如果主机在禁止中断的情况下尝试发送数据怎么办?

我想,由于I2C接口仍处于启用状态,因此传入的字节至少将被写入TWDR。那是对的吗? 如果是,是否有办法在主例程访问完变量后立即触发ISR?

然后:如果一个实例(ISR或main)仅读取而不写入缓冲区的特定部分,这个问题是否仍然存在?

1 个答案:

答案 0 :(得分:1)

通常,您需要在主流程(主程序)中创建一个关键部分。当主程序访问共享变量时,您需要禁用中断。

您有现成的标准解决方案:

 #include <util/atomic.h>

 /* ....*/ 

 ATOMIC_BLOCK(ATOMIC_FORCEON)
 {
     /* potentially non atomic opeartions */
 }