【发布时间】:2017-01-13 05:00:15
【问题描述】:
我正在开发 CodeWarrior V10.6 中的 Motorola HCS08 µCU,我正在尝试创建一个 extern 位域,其中包含来自现有寄存器的位。 µCU 标头中创建位域的方式类似于
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 = 0x01 或PTAD_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, ...}},因为由于某种原因,LCDSTR 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 中包含的内存地址的最后一个(我认为)字节,你知道,因为结构实际上并不包含数据,而是包含指针。
我将如何继续实现能够包含和修改来自多个寄存器的位的结构? (我想这里的问题是,在内存中,这些位不是一个接一个的,我想这会更容易)。甚至可能吗?我希望是的。
【问题讨论】:
-
是否有映射到特定寄存器的内存地址?例如,内存地址 0x00000000 映射到寄存器 0,内存地址 0x00000001 映射到寄存器 1(假设 1 字节或 8 位寄存器)?我希望使用相同的
PTADSTR结构进行定义,然后创建一个指向寄存器所在内存区域开头的指针,并将它们作为PTADSTR结构的数组引用。 -
你不能有一个指向位域的指针。看stackoverflow.com/questions/13547352/…。
-
@RichardChambers 我可以说,在定义中进一步将 PTADDSTR 结构定义为 0x00000001,然后将 PTBDSTR 定义为 0x00000002,然后将 PTBDDSTR 定义为 0x00000003 等等,是的 8 位寄存器,我想答案你的第一个问题,但我不明白你的想法,创建一个数组,其中包含指向每个结构位的指针,你说?
-
指针不是指向结构的每一位,而是指向映射到 8 位寄存器的内存区域开头的指针,这将是 PTADSTR 结构的数组。然后使用
_PTAD[0].Byte = 4;或_PTAD[0].Bits.PTAD1 = 1;和volatile PTADSTR (* const _PTAD) = 0x00000000;,我的理解是类似于extern volatile PTADSTR _PTAD @0x00000000;的含义。您可能希望使用_PTAD以外的其他名称,因为系统标头已经使用了它。 -
但是我可能会误解您的问题以及您想要完成的工作,因为我并不完全清楚您想要做什么。
标签: c struct microcontroller bit-fields codewarrior