IAR Pragma data_alignment 不工作
IAR Pragma data_alignment not working
我正在尝试为 ARM-A7(裸机应用程序)编译嵌入了 IAR workbench 的 libvpx 库(google 的 webm 解码器)。
我设法拉入了所有必要的文件,并且编译通过了,但是一些变量的数据对齐有问题。
在库中,有一个扩展为 GNUC __attribute__(aligned(n)) 预处理器指令的宏 DATA_ALIGNMENT()。我想我设法让这个宏与 IAR 版本的数据对齐(pragma 数据对齐)一起工作,但我收到以下警告
"Warning [Pe609]: this kind of pragma may not be used here"
当我 运行 代码时,我的变量没有对齐!
在互联网上搜索警告时,他们说您不能对变量的定义使用 pragma,而只能在创建某种变量时使用!但是,对于数据对齐,您需要在定义结构时执行此操作(并且 GCC 允许这样做,那么为什么 IAR 不允许呢?)
如有任何帮助,我们将不胜感激!
代码
宏定义:
#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;
我已经在我的 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
}
除非您需要您的结构按特定顺序排列,例如映射到某物上,否则仔细排序您的结构可以减小其大小。例如,我在这种情况下插入的填充很可能无论如何都会被编译器插入。 int a, int c, char b, char d.
的顺序会更好,因为由于填充和对齐,原始结构可能有 16 个字节长。而它可以只设置为 12.
我正在尝试为 ARM-A7(裸机应用程序)编译嵌入了 IAR workbench 的 libvpx 库(google 的 webm 解码器)。
我设法拉入了所有必要的文件,并且编译通过了,但是一些变量的数据对齐有问题。
在库中,有一个扩展为 GNUC __attribute__(aligned(n)) 预处理器指令的宏 DATA_ALIGNMENT()。我想我设法让这个宏与 IAR 版本的数据对齐(pragma 数据对齐)一起工作,但我收到以下警告
"Warning [Pe609]: this kind of pragma may not be used here"
当我 运行 代码时,我的变量没有对齐!
在互联网上搜索警告时,他们说您不能对变量的定义使用 pragma,而只能在创建某种变量时使用!但是,对于数据对齐,您需要在定义结构时执行此操作(并且 GCC 允许这样做,那么为什么 IAR 不允许呢?)
如有任何帮助,我们将不胜感激!
代码
宏定义:
#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;
我已经在我的 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
}
除非您需要您的结构按特定顺序排列,例如映射到某物上,否则仔细排序您的结构可以减小其大小。例如,我在这种情况下插入的填充很可能无论如何都会被编译器插入。 int a, int c, char b, char d.
的顺序会更好,因为由于填充和对齐,原始结构可能有 16 个字节长。而它可以只设置为 12.