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