1

我尝试使用外部 MCU (EFM32) 使 BLE121LR 模块工作。据我所知,这段代码声明了将结构转换为二进制数据,对吗?有人可以解释一下如何为其添加 ARM (EFM32) 支持吗?非常感谢!!

代码:

/* Compability */
#ifndef PACKSTRUCT
    #ifdef PACKED
        #define PACKSTRUCT(a) a PACKED 
    #else
/*Default packed configuration*/
        #ifdef __GNUC__
            #ifdef _WIN32
                #define PACKSTRUCT( decl ) decl __attribute__((__packed__,gcc_struct))
            #else
                #define PACKSTRUCT( decl ) decl __attribute__((__packed__))
            #endif
            #define ALIGNED __attribute__((aligned(0x4)))
        #else //msvc
            #define PACKSTRUCT( decl ) __pragma( pack(push, 1) ) decl __pragma( pack(pop) )
            #define ALIGNED
        #endif
    #endif
#endif
4

1 回答 1

2

是的,打包结构会影响结构在内存中的存储方式,这通常用作将结构转换为二进制数据的快速而简单的方法。

PACKSTRUCT 宏不是为 keil armcc 编译器编写的。要解决这个问题,我们必须首先找到如何识别何时使用 armcc。在这个页面上,我们可以看到 armcc 提供了定义 __ARMCC_VERSION,我们可以使用它。

现在,我们如何使用 armcc 声明一个打包的结构?在这里,我们看到我们应该使用 __packed 限定符:

/* Compability */
#ifndef PACKSTRUCT
    #ifdef PACKED
        #define PACKSTRUCT(a) a PACKED 
    #else
/*Default packed configuration*/
        #ifdef __GNUC__
            #ifdef _WIN32
                #define PACKSTRUCT( decl ) decl __attribute__((__packed__,gcc_struct))
            #else
                #define PACKSTRUCT( decl ) decl __attribute__((__packed__))
            #endif
            #define ALIGNED __attribute__((aligned(0x4)))
        #else   // not __GNUC__
            #ifdef __ARMCC_VERSION
                #define PACKSTRUCT( decl ) __packed decl
                #define ALIGNED
            #else // Assume msvc
                #define PACKSTRUCT( decl ) __pragma( pack(push, 1) ) decl __pragma( pack(pop) )
                #define ALIGNED
            #endif
        #endif
    #endif
#endif
于 2015-09-02T08:13:25.497 回答