- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
只是想知道关于 C 中 I²C 寄存器映射的最佳实践是什么,或者其他人经常使用/更喜欢什么。
到目前为止,我通常已经做了很多定义,一个用于每个寄存器,一个用于所有位、掩码、移位等。然而,最近我看到一些驱动程序使用(可能是打包的)结构而不是定义的。我认为这些是 Linux 内核模块。
无论如何,他们会
struct i2c_sensor_fuu_registers {
uint8_t id;
uint16_t big_register;
uint8_t another_register;
...
} __attribute__((packed));
然后他们会使用 offsetof(或宏)获取 i2c 寄存器并使用 sizeof 获取要读取的字节数。
我发现这两种方法各有优点:
结构方法:
定义方法:
基本上,我正在寻找一种更智能的方法来处理这些情况。我经常发现自己为每个寄存器和每个位输入很多长得令人痛苦的符号名称,可能还有掩码和移位(后两者取决于数据类型),只是最终只使用了其中的几个(但讨厌稍后重新定义丢失的符号,这就是为什么我在一个 session 中输入所有符号的原因)。不过,我注意到要读/写的字节大小大多是魔数(Magic Number),通常需要并排阅读数据表和源代码才能理解即使是最基本的交互。
我想知道其他人是如何处理这些情况的?我在网上找到了一些例子,人们还在一个大标题中费力地输入了每个寄存器、位等,但没有什么是确定的……然而,上面的两个选项在这一点上似乎都不太聪明:(
最佳答案
警告:此处描述的方法使用位域,其在内存中的排列是特定于实现的。如果你这样做,请确保你知道你的编译器在这方面是如何工作的。
正如您所指出的,每种方法都有优点和缺点。我喜欢混合方法。您可以定义寄存器偏移量,然后使用结构来表示内容,并使用 union 来指定位或整个寄存器。在 union 内部,使用正确的大小变量作为寄存器的大小(正如您提到的,有时它们不是字节可寻址的)。您不需要那么多的定义,并且不太可能搞乱位移并且不需要掩码。例如:
#define unsigned char u8;
#define unsigned short u16;
#define CTL_REG_ADDR 0x1234
typedef union {
struct {
u16 not_used:10; //top 10 bits ununsed
u16 foo_bits:3; //a multibit register
u16 bar_bit:1; //just one bit
u16 baz_bits:2; //2 more bits
} fields;
u16 raw;
} CTL_REG_DATA;
#define STATUS_REG_ADDR 0x58
typedef union {
struct {
u8 bar_bits:4; //upper nibble
u8 baz_bits:4; //lower nibble
} fields;
u8 raw;
} STATUS_REG_DATA;
//use them like the following
u16 readregister(u16);
void writeregister(u16,u16);
CTL_REG_DATA reg;
STATUS_REG_DATA rd;
rd = readregister(STATUS_REG_ADDR);
if (rd.fields.bar_bit) {
reg.raw = 0xffff; //set every bit
reg.fields.bar_bit = 0; //but clear this one bit
writeregister(CTL_REG_ADDR, reg);
}
关于c - 最佳常见做法 I2C 寄存器映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13475828/
如果您想分享更多信息,可以在这里找到整个资源 指针: https://github.com/sergiotapia/DreamInCode.Net 基本上,我的API将为其他开发人员提供
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我不是 SCM 工具的经验丰富的用户,尽管我确信它们的用处,当然。 我在以前的工作中使用了一些不起眼的商业工具,在当前的工作中使用了 Perforce,并在我的小型个人项目中使用了 TortoiseS
所以我想知道一些我应该避免在 javascript 中做的事情以获得良好的 SEO 排名。在我的下一个站点中,我将广泛使用 jquery 和 javascript,但不想牺牲 SEO。那么您认为我应该
基本上,我想知道什么是避免 future CSS 代码出现问题和混淆的最佳方法... 像这样命名 CSS 属性: div#content ul#navigation div.float-left (真
我是一名优秀的程序员,十分优秀!