gpt4 book ai didi

c - 如何从 C 中的现有变量创建位域

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:15 25 4
gpt4 key购买 nike

我正在使用 CodeWarrior V10.6 开发摩托罗拉 HCS08 µCU,我正在尝试创建一个 extern 位域,其中包含来自现有寄存器的位。在 µCU header 中创建位域的方式类似于

typedef unsigned char byte;
typedef union {
byte Byte;
struct {
byte PTAD0 :1;
byte PTAD1 :1;
byte PTAD2 :1;
byte PTAD3 :1;
byte PTAD4 :1;
byte PTAD5 :1;
byte PTAD6 :1;
byte PTAD7 :1;
} Bits;
} PTADSTR;
extern volatile PTADSTR _PTAD @0x00000000;
#define PTAD _PTAD.Byte
#define PTAD_PTAD0 _PTAD.Bits.PTAD0
#define PTAD_PTAD1 _PTAD.Bits.PTAD1
#define PTAD_PTAD2 _PTAD.Bits.PTAD2
#define PTAD_PTAD3 _PTAD.Bits.PTAD3
#define PTAD_PTAD4 _PTAD.Bits.PTAD4
#define PTAD_PTAD5 _PTAD.Bits.PTAD5
#define PTAD_PTAD6 _PTAD.Bits.PTAD6
#define PTAD_PTAD7 _PTAD.Bits.PTAD7

这将使寄存器值通过 PTAD = 0x01PTAD_PTAD0 = 1 更改,例如。这个定义对于 PTAD、PTBD、PTCD、...PTGD 基本相同,唯一改变的是地址。

我尝试从以前的现有变量中创建自定义位域是

typedef union {
byte Byte;
struct {
byte *DB0;
byte *DB1;
byte *DB2;
byte *DB3;
byte *DB4;
byte *DB5;
byte *DB6;
byte *DB7;
} Bits;
} LCDDSTR;

我会将位域创建并初始化为 LCDDSTR lcd = {{&PTGD_PTGD6, &PTBD_PTBD5, ...}},因为出于某种原因,初始化类似于 LCDDSTR lcd = {*. Bits.DB0 = &PTGD_PTGD6, *.Bits.DB1 = &PTBD_PTBD5, ...}(将其视为一个结构,请再次纠正我)How to initialize a struct in accordance with C programming language standards 中的建议不适用于此编译器(它确实适用于在线编译器)。

但是,如您所见,我正在对这些位进行分组,并且(如果可行的话)我可以通过执行 *lcd.Bits.DB0 = 1< 来更改实际寄存器的值 或类似的东西,但如果我执行 lcd.Byte = 0x00,我将更改 lcd.Bits 中包含的内存地址的最后一个(我认为)字节。 DB0,您知道,因为该结构实际​​上并不包含数据,而是包含指针。

我将如何继续实现一个能够包含和修改来自多个寄存器的位的结构? (我想这里的问题是在内存中这些位不是一个挨着另一个,我想这会更容易)。有可能吗?我希望是这样。

最佳答案

How would I go on achieving a struct that is able to contain and modify bits from several registers? (I guess the problem here is that in memory the bits are not one next to the other..

我不认为你可以用一个结构来做到这一点。这是因为根据定义,位域必须占用相同或连续的地址。

但是宏在这里可能很有用

#define DB0  PTGD_PTGD6
#define DB1 PTBD_PTBD5
....

要将这些位清除为全 0 或设置为全 1,您可以使用多行宏

#define SET_DB(x) do { \
PTGD_PTGD6 = x; \
PTBD_PTBD5 = x; \
...... \
} while(0)

关于c - 如何从 C 中的现有变量创建位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41627667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com