使用联盟代表登记册

时间:2014-04-03 12:42:41

标签: c unions

我正在尝试使用联合设置HCS12处理器的内部寄存器。这是我目前拥有工会的方式:

union byte{
    struct{
        unsigned int B0: 1;
        unsigned int B1: 1;
        unsigned int B2: 1;
        unsigned int B3: 1;
        unsigned int B4: 1;
        unsigned int B5: 1;
        unsigned int B6: 1;
        unsigned int B7: 1;
    }idv;
    unsigned int All: 8;
};

union allPurpose{
    struct {
        union byte A;
        union byte B;
    } AB;
    unsigned int D: 16;
};

问题是当我使用int All将A初始化为170并将B初始化为187时。 D应该是43,407但是170.我知道嵌套的工会有效,但由于某种原因它不起作用。如果有人能看到错误并且可以提供帮助,那将不胜感激。

编辑:这是使用联合的代码。

HCS12.accumulator.AB.A.All=0xAA;
HCS12.accumulator.AB.B.All=0xBB;
printf("\nReg A: %d",HCS12.accumulator.AB.A.All);
printf("\nReg B: %d",HCS12.accumulator.AB.B.All);
printf("\nReg D: %d",HCS12.accumulator.D);

Union allPurpose正处于另一种结构中。

2 个答案:

答案 0 :(得分:0)

您不能假设union byte A;union byte B;在内存中连续打包。

(事实上,在现代架构中,它们不太可能是因为它们只有一个字节大小)。

具体的包装安排由编译器和平台选择决定。典型的排列是4字节打包,这意味着您的结构如下所示:

 struct {
     union byte A;
     /*Three bytes of packing*/
     union byte B;
 } AB;

答案 1 :(得分:0)

  • 首先,您不应该在multiple reasons的嵌入式系统中使用位字段。很可能你的问题来自于编译器指定的位顺序(可能是Codewarrior?)。

    我强烈建议使用以下100%可移植语法:

    #define PEAR    (*(volatile uint8_t*)0x000Au)
    #define NOACCE  0x80u
    #define PIPOE   0x20u
    #define NECLK   0x10u
    #define LSTRE   0x08u
    #define RDWE    0x04u
    
  • 使用嵌入式系统时,不应使用C中的默认原始数据类型(例如unsigned int)。请改用stdint.h中的uint16_t等。

  • 将一个8位成员和一个16位成员联合起来没有任何意义。这可能是问题的原因。

  • 通常避免在映射硬件寄存器时使用结构/联合,因为编译器可能会在结构内的任何位置引入填充。由于HCS12是一个不关心对齐的好核心,因此在您的具体情况下这不是问题。

修改

你的printf代码看起来很可疑。 printf()使用参数提升到int。请查看调试器内存映射。你的变量有什么价值?