【发布时间】:2020-08-28 03:19:20
【问题描述】:
我在 PIC18F87K90 微控制器中使用 c 编程。我在创建结构变量(其中包含联合)以更轻松地访问多个标志(大多数是 1 位标志,但有些是 2 位或 3 位)时遇到问题。
下面的代码运行良好。我使用模拟器检查每个成员的地址字节。联合内部结构的成员被分组在同一个地址字节中,我希望这是因为成员总共有 8 位,应该适合 1 字节。我还检查了以下地址: eeprom_flag.byte0, eeprom_flag.reset_time_byte... 等等,由于联合使用,它们在同一个地址。 我的问题是我想为 1 位标志之一设置两个可能的名称,即 eeprom_flag.output_time_bit。我想为它取另一个名字(但完全相同的变量位,相同的地址)。我尝试使用 union 来做到这一点(请参阅下面的注释行)。但是,这样做会破坏我的代码,使结构的成员不再位于相同的地址中。我的目标是按照上传的图片进行寻址。
typedef struct
{
//buffer index 0
union
{
struct
{
uint8_t reset_time_bit:1;
// union
// {
uint8_t output_time_bit:1; //shared address
// uint8_t output2_time_bit:1;
// };
uint8_t count_mode_bit:3;
uint8_t input_mode_bit:1;
uint8_t count_speed_bit:2;
};
uint8_t byte0;
uint8_t reset_time_byte;
uint8_t output_time_byte;
uint8_t output2_time_byte;
uint8_t count_mode_byte;
uint8_t input_mode_byte;
uint8_t count_speed_byte;
};
} eeprom_flag_t;
extern volatile eeprom_flag_t eeprom_flag;
【问题讨论】:
-
联合的最小大小是一个字节。你无法实现你所追求的。使用包含位字段和其他名称之一的结构的联合是有一定意义的。为 8 位值设置 7 个(而不仅仅是 1 个)名称并没有什么明显的好处。
-
也许:
#define output2_time_bit output_time_bit -
感谢您的建议。关于不使用#define,#ifdef,#endif,使用output2_time_bit还是output_time_bit的决定将在我的微控制器初始化之后做出,所以它在技术上是在运行时,虽然只是在初始化。