【问题标题】:How to set 45th bit in a 64 bit register field?如何在 64 位寄存器字段中设置第 45 位?
【发布时间】:2020-05-11 03:17:48
【问题描述】:

我试图使用 C 设置一个 64 位宽的寄存器中的第 46 位。我该如何设置这个位?

目前我正在这样做:

uint32_t= address ;
uint64_t data =1ULL << 46;

打印这表明第 14 位正在设置。我无法设置第 32 位。如果我设置第 32 位,它会设置第 0 位。33 将设置第 1 位。看起来它在 0- 之后进行循环移位31 再次从 0 开始。

以 64 位宽注册。

知道如何设置这个位吗?

例如:

reg_addr.val = FEATURE_REG;

printf(stdout, "Programming enable at address %x=%llx\n",
    reg_addr.val,reg_addr.val);

data.val = (1ULL << 46);

printf("Data value %llx\n",data.val);}

【问题讨论】:

  • @Thej 不,你不是,你已经问了 8 个问题,其中有 5 个问题你应该考虑你收到的最佳答案。
  • 您的编译器似乎有问题。试试(1ULL &lt;&lt; 23) &lt;&lt; 23 看看是否能解决问题。
  • 你能展示一个完整的例子吗?因为换档是正确的。
  • 你如何检查设置的位?
  • 我正在读回寄存器值。

标签: c bit-manipulation


【解决方案1】:

如果您使用类型为 uint32_t 或 uint64_t 打印正确完成:

printf(stdout, "Programming enable at address %" PRIu32 "=%" PRIu64 "\n",reg_addr.addr, reg_addr.val);

假设 reg_addr.addr 的类型为 uint32_t,而 reg_addr.val 的类型为 uint64_t。

【讨论】:

    【解决方案2】:

    你的代码是正确的。

    您应该检查您的平台是否正确支持 64 位整数类型:

    printf("%zu %zu\n", sizeof 1ULL, sizeof data);
    

    应该打印

    8 8
    

    如果是这种情况,错误可能是(如 cmets 中的@pmg 所述)您如何检查该位是否已设置。

    在新编辑中,您提到它是一个寄存器。 IO 寄存器由于其 volatile 属性而具有特殊行为。我建议你先检查设置一个正常的对象。

    【讨论】:

    • 我有一个从设备读取数据并以这种格式(无符号字符*)和数据保存的函数。这个数据值是我正在读取和打印的,这个数据被声明为 uint64_t
    【解决方案3】:

    希望你不要检查这一行的输出来断定移位没有正确完成!?

    printf(stdout, "地址 %x=%llx\n 的编程使能", reg_addr.val,reg_addr.val);

    将 64 位值两次传递给 printf,但使用 %x(可能是 32 位)和 %llx(64 位)输出值将不起作用。我猜你的意思是在第一个参数中获取 reg_addr.val 的地址!?

    printf(stdout, "地址 %x=%llx\n 的编程使能", &reg_addr.val,reg_addr.val);

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 2015-06-24
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多