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

请高手指点: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版