szgaos 发表于 2015-6-24 14:00:35

请高手指点:gcc与mdk中程序转化

在gcc中有样一个定义:
typedef struct _CRTPPacket
{
uint8_t size;
union {
    struct {
      union {
      uint8_t header;
      struct {
          uint8_t channel   : 2;
          uint8_t reserved    : 2;
          uint8_t port      : 4;
      };
      };
      uint8_t data;
    };
    uint8_t raw;
};
} __attribute__((packed)) CRTPPacket;


定义好后,使用时只需要用
CRTPPacket mm;
mm.port =2;
mm.reserved = 3
但在mdk中就不行
struct ,union 必须实名化,这要就要写一大串了
请问在MDK中有没有简单的方法实现功能

moyanming2013 发表于 2015-6-24 15:18:03

keil里面应该支持这种嵌套了吧,
否则你试试下面的这种定义方式吧:
typdef union{
        uint8_t header;
        struct{
                uint8_t channel:2;
                uint8_t reserved:2;
                uint8_t port:4;
        }header_s;
}HEADER;

typdef struct{
        uint8_t data;
        HEADER header;
}DATA;

typdef union{
        uint8_t raw;
        DATA data;
}RAW;

typedef struct _CRTPPacket{
        uint8_t size;
        RAW raw;
} __attribute__((packed)) CRTPPacket;

CRTPPacket mm;
mm.raw.data.header_s.port = 2;
mm.raw.data.header_s.reserved = 3;
一般中间函数可以使用中间的一些结构体或者联合体,这样模块化更强一些。

lkl0305 发表于 2015-6-24 23:15:41

学习了

Kevin_Liao 发表于 2015-7-14 12:55:11

會比較長. 以下是我的code, 作為例子.

#pragma anon_unions
typedef union
{
    struct
    {
      s8 cIValue;
      s8 cQValue;
    } IQ;
    s8 cValues;
    u8 bValues;
    u16 uIQValue;
} __attribute__ ((aligned(1))) IQValue_t;
页: [1]
查看完整版本: 请高手指点:gcc与mdk中程序转化