通过 16 位数据总线访问不断变化的 32 位寄存器(如计数器)的最佳做法是什么?我想我必须在读取 LSB 时“冻结”或复制 32 位值,直到 MSB 也被读取,反之亦然,以避免在两次访问之间 LSB 溢出到 MSB 时数据损坏。有标准的方法吗?
问问题
92 次
2 回答
1
没有标准的方法,但一种常用的方法是让读取一个地址返回前 16 位,同时捕获剩余的 16 位,稍后在另一个地址读取。
于 2016-10-10T10:41:45.963 回答
1
正如问题和 Morten 的回答中所建议的那样,在读取前半部分时保存值的第二个寄存器是一种常用方法。在某些 MCU 中,此寄存器对多个设备是通用的,这意味着您需要禁用两个访问之间的中断或确保 ISR 不会触及额外的寄存器。写入的处理方式类似,通常以相反的顺序进行(写入第二个字临时存储,然后在设备上写入第一个字,从而触发设备同时读取第二个字)。
在某些情况下,您无法原子地访问寄存器。在这种情况下,您可能需要实现额外的逻辑来确定真实值。假设三个读取比1<<15
计数器滴答时间少得多的这种算法的示例可能是:
earlyMSB = highreg;
midLSB = lowreg;
lateMSB = highreg;
fullword = ((midLSB<0x8000 ? lateMSB : earlyMSB)<<16) | midLSB;
其他变体可能使用溢出标志来表示更重要的字需要增量(通常用于在软件中实现该部分计数器)。
于 2016-10-10T11:12:44.843 回答