项目场景:
Xilinx Artix®-7 FPGA系列 xc7a200t ,AXI总线32位寻址。
microblaze C语言程序创建了一个结构体,用于处理总线协议的数据。数据最终需要存储在ddr中。
结构体总共1027个字节,其中前3个字节用于协议逻辑运输,后1024字节用于存储协议数据,凑齐1024字节写到ddr存储中。写到ddr的接口函数在是按照4字节写入。
问题描述
typedef unsigned char u8;
typedef struct{
u8 a;
u8 b;
u8 c;
u8 buff[1024];
}test_t;
test_t t;
void test_init()
{
t.a =1;
t.b =2;
t.c =3;
memset(t.buff,0x08,sizeof(u8)*1024);
u32* data =(u32*) t.buff;
for (u32 i = 0; i < 8; i++)
{
xil_printf("%04x\n\r",data[i]);
}
}
输出结果:
8030201
8080808
8080808
8080808
原因分析:
结构体字节不对齐,在u32* data =(u32*) t.buff;强制类型转换,buff的首地址变成结构体中 a 的地址。所以输出结果为8030201。
解决方案:
1.设置buff为4字节对齐。attribute ((aligned (4)))
typedef unsigned char u8;
typedef struct{
u8 a;
u8 b;
u8 c;
u8 buff[1024]__attribute__ ((aligned (4)));
}test_t;
test_t t;
void test_init()
{
t.a =1;
t.b =2;
t.c =3;
memset(t.buff,0x08,sizeof(u8)*1024);
u32* data =(u32*) t.buff;
for (u32 i = 0; i < 8; i++)
{
xil_printf("%04x\n\r",data[i]);
}
}
输出结果:
8080808
8080808
8080808
8080808