【发布时间】:2019-06-17 10:53:48
【问题描述】:
我在 C 中的 ATmega168(从机)上使用 I2C(使用 avr-gcc 编译),但这可能是关于中断的一般问题。
在我的 C 程序中,我有一个 uint8_t i2c_buffer[32] 类型的全局变量,用于存储一些传感器和配置数据。每当总线主机读取或写入从机时,I2C-ISR 也会访问该数组。
由于通信是在硬件中驱动的,因此向 ram(我的 I2C 缓冲区变量)的传输是由中断触发的。
我知道,由于 ISR 和我的主例程之间的竞争条件,不小心从 ISR 和主例程访问变量可能会导致数据损坏,但我不确定如何正确处理这个问题。 有人告诉我在 main 访问有问题的变量时禁用中断。 这将保护变量免受损坏,但另一方面这不会导致数据丢失吗? 如果主设备尝试在中断被禁用的情况下发送数据怎么办?
我猜,由于 I2C 接口仍然启用,输入字节至少会写入 TWDR。那是对的吗? 如果是:有没有办法在主例程完成访问变量后立即触发 ISR?
而且:如果一个实例(ISR 或主实例)只读取而不写入缓冲区的特定部分,这个问题是否仍然存在?
【问题讨论】: