c - 如何在没有竞争条件的情况下将两个 32 位计数器读取为 64 位整数

标签 c embedded

内存 0x100 和 0x104 是两个 32 位计数器。它们代表一个 64 位定时器并且不断递增。

如何正确读取两个内存地址并将时间存储为 64 位整数?

一个不正确的解决方案:

x = High
y = Low
result =  x << 32 + y

(程序可以换出同时低位溢出...)

附加要求:
仅使用 C,无汇编
总线是 32 位的,所以无法在一条指令中读取它们。
您的程序可能会随时切换上下文。
没有可用的互斥体或锁。

一些高层次的解释是可以的。不需要代码。谢谢!

最佳答案

这是我从 David L. Mills 学到的,谁将它归因于 Leslie Lamport:

  1. 将定时器的上半部分读入H。
  2. 将定时器的下半部分读入L。
  3. 再次将定时器的上半部分读入H'。
  4. 如果 H == H' 则返回 {H, L},否则返回 1。

假设计时器 自身 自动更新,那么这肯定会起作用——如果 L 在步骤 1 和步骤 2 之间的某处溢出,那么 H 将在步骤 1 和步骤 3 之间递增,并且测试在第 4 步将失败。

关于c - 如何在没有竞争条件的情况下将两个 32 位计数器读取为 64 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5162673/

相关文章:

clang 悬挂引用?

c - at91sam7 :interrupt for receiving a new a character uart

c - linux信号掩码函数中sig_atomic_t的用法

C:段错误

c - 向我的小游戏添加功能时出现奇怪错误 (0xC0000005)

c - 8051系列的最佳C编译器是什么?

c - 为什么我的调试器在 switch 语句中的情况之间错误地转换?

c++ - 远程读写结构

c++ - 使用虚函数调用时节省堆栈空间

c - 具有不同格式说明符的 scanf() 函数