【问题标题】:What is the best way to save fields details of sensor's registers?保存传感器寄存器字段详细信息的最佳方法是什么?
【发布时间】:2018-03-09 14:37:15
【问题描述】:

我正在通过 SPI 将传感器连接到 BeagleBone Black。我可以成功读写寄存器。我现在要做的是能够访问寄存器中的每个单独的字段(例如,X1、X3)来读取或写入。

我也可以这样做,但方法很无聊。我通过定义一个包含寄存器中字段名称的枚举来做到这一点。然后我声明了一个包含三个信息的结构:字段的寄存器地址,字段的第一位和最后一位。然后,我用字段数定义了一个结构数组。最后,我必须为每个单独的字段初始化这三个值(地址、第一位和最后一位)。

以下是我的代码示例:

enum {X1, X2, X3,     // Fields of register in address 0
      X4, X5,         // Register in address 1
      X6, X7          // Register in address 2
     } FIELD;

typedef struct
{
      int address;
      int first_bit;
      int last_bit;
} FIELDS;

FIELDS fields[3];

fields[X1] = (FIELDS) {.address = 0x00, .first_bit = ..., .last_bit = ...}
...

正如我所说,这种方式有效,但问题是传感器中有大量字段(大约 60 个)。将来,传感器可能会发生变化,我将不得不更改字段的名称和相关信息。

目前的方法耗时、繁琐、容易出错且不易适应不同的传感器。

我认为应该有一种更智能、适应性更强且不易出错的方法来做到这一点? 您能否建议任何更好的方法来实现我的目标?

【问题讨论】:

  • 这有什么意义?为什么要使用枚举?使用诸如uint8_t 之类的原始位字段,然后使用位运算符对其进行屏蔽。是什么让您认为另一个传感器将以相同的方式具有内部存储器映射?这是极不可能的——即使它遵循相同的 SPI 设置,您也会感到高兴,因为 SPI 的标准化程度很低。此外,无法保证传感器寄存器等的字节顺序。没有“便携式驱动程序”之类的东西,如果您更改传感器,则必须重写驱动程序。
  • 我使用枚举来通过唯一名称调用每个字段(例如 X1)。感谢您的评论
  • 为什么你不能在 X1 是唯一位掩码的地方做 field[0] & X1
  • 好吧,我只是事先没有这个想法。

标签: c


【解决方案1】:

嗯,本质上是“不”,因为它归结为相关传感器的特定寄存器布局。据我所知,这些是从不自我描述的,所以你必须在软件端静态地“知道”什么是可用的以及在哪里。

当然,如果您不顾一切,您可以做的是发明(或找到)一种比 C 更擅长描述任意位字段的 DSL,并在其中描述寄存器集。然后使用代码生成技术来制作所需的 C 代码,从而将需要更新的部分转换为更合适的语言(当然,代价是更实际的软件复杂性)。

【讨论】:

  • 感谢您的回答。我认为与更复杂的工作相比,我更喜欢更长但更轻松的工作。我会以同样的方式继续这样做
猜你喜欢
  • 1970-01-01
  • 2014-01-08
  • 2012-05-07
  • 2017-03-15
  • 2011-02-24
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 2018-04-19
相关资源
最近更新 更多