你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
szgaos 提问时间:2015-6-24 14:00 /
在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[CRTP_MAX_DATA_SIZE];
    };
    uint8_t raw[CRTP_MAX_DATA_SIZE+1];
  };
} __attribute__((packed)) CRTPPacket;


定义好后,使用时只需要用
CRTPPacket mm;
mm.port =2;
mm.reserved = 3
但在mdk中就不行
struct ,union 必须实名化,这要就要写一大串了
请问在MDK中有没有简单的方法实现功能
收藏 评论3 发布时间:2015-6-24 14:00

举报

3个回答
moyanming2013 回答时间:2015-6-24 15:18:03
keil里面应该支持这种嵌套了吧,
否则你试试下面的这种定义方式吧:
  1. typdef union{
  2.         uint8_t header;
  3.         struct{
  4.                 uint8_t channel:2;
  5.                 uint8_t reserved:2;
  6.                 uint8_t port:4;
  7.         }header_s;
  8. }HEADER;

  9. typdef struct{
  10.         uint8_t data[CRTP_MAX_DATA_SIZE];
  11.         HEADER header;
  12. }DATA;

  13. typdef union{
  14.         uint8_t raw[CRTP_MAX_DATA_SIZE+1];
  15.         DATA data;
  16. }RAW;

  17. typedef struct _CRTPPacket{
  18.         uint8_t size;
  19.         RAW raw;
  20. } __attribute__((packed)) CRTPPacket;

  21. CRTPPacket mm;
  22. mm.raw.data.header_s.port = 2;
  23. 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[2];
    u8 bValues[2];
    u16 uIQValue;
} __attribute__ ((aligned(1))) IQValue_t;

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版