我看到一些代码会读/写一些外设寄存器。我看到写操作都跟着一些延迟。在我看来,SW需要等待该值对HW生效。有些网页说寄存器会在每个时钟周期更新。我猜这就是等待的原因。好吧,我的问题是:
[延迟]
tmp = some_register // read
some_register = tmp + 1 //写
[延迟]
或
tmp = some_register // read
[延迟]
some_register = tmp + 1 //写
[延迟]
如果SW写入操作后没有这样的延迟怎么办?我实际上看到一些没有延迟的写操作可以在一些较慢的CPU上正常工作。但是当代码在某个更快的CPU上运行时,它就会失败。我认为延迟是合理的。我只需要解释为什么它适用于较慢的CPU。
我对寄存器的功能不太熟悉。任何有用的材料或链接?
答案 0 :(得分:0)
写完后你的延迟。
硬件;外部串行板需要一些时间来实现。 CPU可以非常快速地将数据写入IO寄存器。 许多IO芯片不经常接受更改。
IO端口上最简单的设备是连接到LED的锁存器。 如果你写1,灯就亮了。如果你写0就会消失。 如果您将0,1,0,1写入设备的速度比更改状态的速度快,则不会更新。 设备可以从计算机的数据总线可靠地获取数据的速度通常比将输出更改为现实世界的速度快。 IO设备中存在更大的电压和更高的电流,并且它们比注册更改所需的小信号需要更多的时间来改变。 为了降低功耗,许多器件使用时钟输出引脚。这是因为CMOS器件(CMOS是目前常见的芯片制造技术)消耗的功率与比特的变化率成比例。保持所有位相同使用小功率。变更使用它。
具有时钟IO的设备(以及串行端口是此类的明确情况)将仅在下一个时钟更改/更新。
当您使用串行端口发送串行数据时,可能需要数百万个CPU时钟才能传输数据(如果串行端口的速度(波特率)设置得非常低)
简单串行端口的最简单正确延迟是读取“状态寄存器”的“就绪位”,当它准备发送另一个字节时,写入它。
高级解决方案使用缓冲区和中断。这有点让您担心。