C联盟要复制内存

时间:2015-07-13 17:20:58

标签: c stm32

我有以下遗留代码:

#define UINT8 unsigned char
#define UINT16 unsigned short
#define UINT32 unsigned long
typedef union
{
    struct
    {
        UINT16  R1: 1;
        UINT16  S1: 1;
        UINT16  S2: 1;
        UINT16  D1: 1;
        UINT16  I1: 1;
        UINT16  S3: 1;
        UINT16  S4: 1;
        UINT16  S5: 1;
        UINT16  S6: 1;
        UINT16  P1: 1;
        UINT16  F1: 1;
        UINT16  I2: 1;
        UINT16  R2: 4;
    }bb;
    UINT16  V16;
}test_union11;

typedef struct                    /* memory index */   
{                                 /* ++++++++++++ */   
  // Write Config 01-32
  UINT16       i1;          /*    0   */         
  UINT16       i2;          /*    2   */         
  // Faults
  UINT16       o3;          /*    4   */        
  UINT16       o4;          /*    6   */       
  UINT16       o5;          /*    8   */         
  UINT16       o6;          /*   10   */         
  // Values 01-08
  UINT8        o7;          /*   12   */         
  UINT8        o8;          /*   13   */        
  UINT8        o9;          /*   14   */         
  UINT8        o10;         /*   15   */         
  UINT8        o11;         /*   16   */         
  UINT8        o12;         /*   17   */         
  UINT8        o13;         /*   18   */         
  UINT8        o14;         /*   19   */        
  // Values 09-12
  UINT16       o15;         /*   20   */         
  UINT16       o16;         /*   22   */         
  UINT16       o17;         /*   24   */        
  UINT16       o18;         /*   26   */        
  // Values 13-14
  UINT32       o19;        /*   28   */        
  UINT32       o20;        /*   32   */        

  UINT8        OctStr[8];
} test_str11;

test_str11 test_str1;
test_union11 test_union;
int test_memcpy(void) {


    test_str1.o15 = 1500;
    test_union.V16 = test_str1.i1;
    memcpy(&test_union,&test_str1,sizeof(test_union11));
}

int main(void) {
    test_memcpy();
    printf("Test Pass!\n");
    return 0;
}

test_union.V16 = test_str1.i1行背后的想法是test_union.bb嵌套结构是否填充了来自结构" test_str1"的数据?但是出于某种原因,既不是在那条线之后也不是在发生的memcpy之后。为什么?联合内部嵌套结构中数字的含义是什么?

我测试了这种情况,当没有这样的数字具有较小的联合和结构和memcpy时,虽然第一个元素赋值的技巧没有。但是这样的语法:

un = (*(test_union1*)&st);

也为第二次测试做了准备,并没有提供所提供的代码。这两个表达有什么区别?并且test_union.V16 = test_str1.i1只复制i1变量或者test_union.bb可以容纳的字节数吗?

代码应该在stm32f10x嵌入式平台上运行,尽管它目前在PC上的Visual Studio中都不起作用。因此,这是纯粹的C问题。 谢谢!

1 个答案:

答案 0 :(得分:1)

您尚未向test_str.i1分配任何内容。如果你这样做,我认为你的程序会起作用。这种联合的想法是提供一种简单的方法来获得unsigned int V16中的16位。但是,这是依赖于平台的代码,因为int可能不是16位(通常是32位)。

联合的大小将是其最大成员的大小。但是,我不确定对齐规则对于大小错误匹配是什么。

最后,我认为获得位的最佳方法是使用逐位运算符&,|等