小编Ken*_*Liu的帖子

在c中使用struct进行位字段提取

我使用这两种方法从寄存器中获取位字段信息.我需要提取的位字段的位置由Intel Manual提供.就像下面的代码一样.但是我得到的结果与这两种方法不同.

我找不到这两种方法的任何问题.但根据我的理解,maximum_power字段不应该是'0'作为第一种方法(这是英特尔已经在寄存器中定义的值.)

方法1:

typedef struct rapl_parameters_msr_t {
  uint64_t thermal_spec_power        : 15;
  uint64_t                           : 1;
  uint64_t minimum_power             : 15;
  uint64_t                           : 1;
  uint64_t maximum_power             : 15;
  uint64_t                           : 1;
  uint64_t maximum_limit_time_window : 6;
  uint64_t                           : 10;
} rapl_parameters_msr_t;

uint64_t              msr;
read_msr(cpu, 0x614, &msr);

rapl_parameters_msr_t domain_msr = *(rapl_parameters_msr_t *)&msr;
printf("%ld\n", domain_msr.thermal_spec_power);  //print: 280
printf("%ld\n", domain_msr.minimum_power);  //print: 192
printf("%ld\n", domain_msr.maximum_power);  //print: 0
printf("%ld\n", domain_msr.maximum_limit_time_window);  //print: 16
Run Code Online (Sandbox Code Playgroud)

方法2:

uint64_t 
extractBitField(uint64_t inField, uint64_t width, uint64_t offset)
{
    uint64_t bitMask;
    uint64_t outField;

    if ((offset+width) == …
Run Code Online (Sandbox Code Playgroud)

c struct bit-manipulation intel cpu-registers

3
推荐指数
1
解决办法
1379
查看次数

标签 统计

bit-manipulation ×1

c ×1

cpu-registers ×1

intel ×1

struct ×1