保存传感器寄存器的字段详细信息的最佳方法是什么?

时间:2018-03-09 14:37:16

标签: c

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

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

以下是我的代码示例:

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个)。将来,传感器可能会发生变化,我将不得不更改字段的名称和相关信息。

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

我认为应该有一个更聪明,更具适应性和更少错误的方法来做到这一点? 你能否建议任何更好的方法来实现我的目标?

Sample of sensor's registers

1 个答案:

答案 0 :(得分:1)

嗯,实质上是“不”,因为它归结为所讨论的传感器的特定寄存器布局。据我所知,这些都不会自我描述,因此您将不得不在软件中静态地“了解”可用的内容和位置。

当然,如果你绝望的话,你可以发明(或找到)一个比C更好地描述任意位字段的DSL,并描述其中的寄存器集。然后使用代码生成技术来生成所需的C代码,从而将需要更新的部分移动到更合适的语言中(当然,代价是更实际的软件复杂性)。