IAR Pragma data_alignment不起作用

时间:2017-03-10 15:56:23

标签: c preprocessor memory-alignment pragma iar

我正在尝试使用IAR嵌入式工作台为ARM-A7(裸机应用程序)编译libvpx库(google的webm解码器)。

我设法提取所有必要的文件,然后进行编译,但是某些变量的数据对齐存在问题。

在库中,有一个宏DATA_ALIGNMENT(),它扩展为GNUC __attribute __(aligned(n))预处理器指令。我想我设法让这个宏与IAR版本的数据对齐(pragma数据对齐)一起使用,但是我得到以下警告
“警告[Pe609]:此处不得使用此类编译指示”
当我运行代码时,我的变量没有对齐!

在互联网上搜索警告时,他们说你不能使用pragma和变量的定义,但只有在创建某种变量时!但是,对于数据对齐,您需要在定义结构时执行此操作(并且GCC允许它,所以为什么IAR不会?)

任何帮助将不胜感激!

CODE

宏定义:

#if (defined(__GNUC__) && __GNUC__) || defined(__SUNPRO_C)
  #define DECLARE_ALIGNED(n, typ, val) typ val __attribute__((aligned(n)))
#elif defined(__ICCARM__)
  #define CONCAT(a,b) a##b
  #define DECLARE_ALIGNED(n, typ, val) CONCAT(DECLARE_ALIGNED_,n) (typ,val)
  #define DECLARE_ALIGNED_1(typ, val) _Pragma("data_alignment=1") typ val
  #define DECLARE_ALIGNED_8(typ, val) _Pragma("data_alignment=8") typ val
  #define DECLARE_ALIGNED_16(typ, val) _Pragma("data_alignment=16") typ val
  #define DECLARE_ALIGNED_32(typ, val) _Pragma("data_alignment=32") typ val
  #define DECLARE_ALIGNED_256(typ, val) _Pragma("data_alignment=256") typ val
#else
  #warning No alignment directives known for this compiler.
  #define DECLARE_ALIGNED(n, typ, val) typ val
#endif

使用的示例:

typedef struct VP9Decoder {
  DECLARE_ALIGNED(16, MACROBLOCKD, mb);  
  DECLARE_ALIGNED(16, VP9_COMMON, common);
  int ready_for_new_data;
  int refresh_frame_flags;
  ...
} VP9Decoder;

1 个答案:

答案 0 :(得分:0)

我已经在我的IAR编译器(7.40.6)中直接尝试了这个并且它工作正常:

#define CONCAT(a,b) a##b
#define DECLARE_ALIGNED(n, typ, val) CONCAT(DECLARE_ALIGNED_,n) (typ,val)
#define DECLARE_ALIGNED_8(typ, val) _Pragma("data_alignment=8") typ val

typedef struct
{
   int a;
   char b;
   char pad1;
   char pad3;
   char pad4;
   int c; 
   char d;  
} myType;

void main( void)
{
   DELCARE_ALIGNED_4( myType, data);
   // So data.a will be aligned to a 4 byte boundary
   // data.b will be aligned to four bytes
   // data.pad, pad1, pad2 are wasted space.
   // data.c will be aligned to four bytes
   // data.d will be aligned to four bytes

}

除非你需要你的结构以特定的顺序,例如映射到某些东西,然后仔细排序你的结构可以减小它的大小。例如,在这种情况下插入的填充非常适合编译器插入。由于填充和对齐,原始结构可能长达16个字节,因此顺序会更好int a, int c, char b, char d.。而它可以只有12。