【问题标题】:how to read/write a register如何读/写寄存器
【发布时间】:2010-08-13 16:25:34
【问题描述】:

我看到一些代码将读取/写入一些外围寄存器。我看到写操作都有一些延迟。在我看来,SW 需要等待该值对 HW 生效。一些网页说寄存器会在每个时钟周期更新。我想这就是等待的原因。好吧,我的问题是:

  1. 读取操作是否也需要这样的延迟?如果是,当 SW 想要读/写一个寄存器时,这样做的正确顺序是什么?喜欢

[延迟]

tmp=some_register //读取

some_register=tmp+1 //写

[延迟]

tmp=some_register //读取

[延迟]

some_register=tmp+1 //写

[延迟]

  1. 如果 SW 在写操作后没有这样的延迟怎么办?我实际上看到一些没有延迟的写操作可以在一些较慢的 CPU 上正常工作。但是当代码在更快的 CPU 上运行时,它会失败。我认为延迟是合理的。我只需要解释一下为什么它适用于较慢的 CPU。

  2. 我对寄存器的功能不是很熟悉。任何有用的材料或链接?

【问题讨论】:

  • 什么平台/CPU、x86、SPARC、BBC Micro? :D
  • 您使用哪种微控制器或微处理器和外部硬件?
  • 外接硬件为串口板

标签: hardware x86 delay


【解决方案1】:

写完后延迟一下。

  • 阅读
  • 延迟

硬件;外部串行板需要一些时间才能发生。 CPU 可以非常快速地将数据写入 IO 寄存器。 许多 IO 芯片不经常接受更改。

IO 端口上最简单的设备是连接到 LED 的锁存器。 如果你写 1,灯会亮。如果你写 0 它就会熄灭。 如果您将 0,1,0,1 写入设备的速度快于设备更改状态的速度,则设备不会更新。 设备从计算机数据总线可靠地获取数据的速度通常比将输出更改为现实世界的速度要快。 IO 设备中有更大的电压和更高的电流,并且它们需要更多的时间来改变,而不是注册改变所需的小信号。 为了降低功耗,许多设备使用时钟输出引脚。这是因为 CMOS 设备(CMOS 是当今常见的芯片制造技术)消耗的功率与位的变化率成正比。保持所有位都相同使用小功率。更改使用它。

具有时钟 IO 的设备(和串行端口是这种情况的明确情况)只会在下一个时钟上更改/更新。

当您使用串口发送串口数据时,可能需要数百万个CPU时钟才能传输数据(如果串口的速度(波特率)设置得很低)

简单串口最简单的正确延迟是读取“状态寄存器”的“就绪位”,当它准备好发送另一个字节时,写入。

高级解决方案使用缓冲区和中断。这有点高级,您还需要担心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2012-06-15
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多