ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
` `Xilinx SDK使用的是GCC,实际上这个方法也适用于所有GCC源码。 ` `首先在声明变量的时候在后面增加attribute。 `int matrix[16][16384] __attribute__((section(".matrix"))); ` ` `然后在Linker Script里面做如下修改: ` `1. 双击打开lscript.ld,在GUI的Available Memory Region里面增加需要的内存区域。当然这一步也可以直接用Text Editor编辑lscript.ld完成。 ` `2. 右键单击lscript.ld,单击Open With->Text Editor。在其中增加.matrix的定义。 编辑完成后的lscript.ld 如下所示: ```c MEMORY {    ps7_ddr_0_S_AXI_BASEADDR : ORIGIN = 0x00100000, LENGTH = 0x3FF00000    ps7_ram_0_S_AXI_BASEADDR : ORIGIN = 0x00000000, LENGTH = 0x00030000    ps7_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x0000FE00    ps7_ddr_0_A_AXI_MATRIX  : ORIGIN = 0x20000000, LENGTH = 0x100000 } .matirx : {    __matrix_start = .;    *(.matrix)    *(.matrix.*)    __matrix_end = .; } > ps7_ddr_0_A_AXI_MATRIX _end = .; } ``` ` `注意:如果Linker Script配置不对,编译不会报错,而是直接把变量放到.data section里面。所以源码里面最好检查一下。 ## 其他常用的Attribute ``` 1. aligned (alignment) This attribute specifies a minimum alignment for the variable or structure field, measured in bytes. 例子:          int x __attribute__ ((aligned (16))) = 0;          struct foo { int x[2] __attribute__ ((aligned (8))); };          short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__))); 2. packed The packed attribute specifies that a variable or structure fieldshould have the smallest possible alignment—one byte for a variable,and one bit for a field, unless you specify a larger value with thealigned attribute. 例子:           struct foo           {             char a;             int x[2] __attribute__ ((packed));           }; ``` ` `**这种方法分配的空间移植性不太好,为了移植性更好,使用指针的形式分配实际物理空间给数组。通过指针直接指定地址。** ```c //定义AD数据基地址 #define AK_5394_DATA_BUF_LEN 204800 //设置数据最大长度 #define AK_5394_DATA1_BASE_ADDR (0x04000000U) //AD数据1基地址 #define AK_5394_DATA2_BASE_ADDR (AK_5394_DATA1_BASE_ADDR + AK_5394_DATA_BUF_LEN*4)//AD数据2基地址 #define AK_5394_TIME1_BASE_ADDR (AK_5394_DATA2_BASE_ADDR + AK_5394_DATA_BUF_LEN*4)//AD数据获取时间1基地址 #define AK_5394_TIME2_BASE_ADDR (AK_5394_TIME1_BASE_ADDR + AK_5394_DATA_BUF_LEN*4)//AD数据获取时间2基地址 int *ak5394_m1=(int*) AK_5394_DATA1_BASE_ADDR;// int *ak5394_m2=(int*) AK_5394_DATA2_BASE_ADDR;// //分配DDR中对应AD数据时间的内存地址给数组 u32 *ak5394_t1 = (u32 *)AK_5394_TIME1_BASE_ADDR;// u32 *ak5394_t2 = (u32 *)AK_5394_TIME2_BASE_ADDR;// ```