最近在学习28377,想将一个数组或结构体定义到内存固定区域。
看了controlSuite中RAM_management的例程,该例程对数组的内存映射操作如下:
CPU1中:
uint16_t c1_r_array[256]; // mapped to GS0 of shared RAM owned by CPU02
uint16_t c1_r_w_array[256]; // mapped to GS1 of shared RAM owned by CPU01
#pragma DATA_SECTION(c1_r_array,"SHARERAMGS0");
#pragma DATA_SECTION(c1_r_w_array,"SHARERAMGS1");
CPU2中:
uint16_t c2_r_w_array[256]; // mapped to GS1 of shared RAM owned by CPU02
uint16_t c2_r_array[256]; // mapped to GS0 of shared RAM owned by CPU01
#pragma DATA_SECTION(c2_r_array,"SHARERAMGS1");
#pragma DATA_SECTION(c2_r_w_array,"0x0000c100");
看了两个CPU的map文件:
CPU1:
0000c000 _c1_r_array
0000d000 _c1_r_w_array
CPU2:
0000c000 _c2_r_w_array
0000d000 _c2_r_array
c1_r_array 和 c2_r_w_array的地址分配正好是一样的,c1_r_w_array和c2_r_array的地址正好是一样的,所以例程未做其他操作就可以在两个CPU间交换读写内存数据。
我不知道编译器的内存分配原则是什么,但是按照我的理解这样分配内存空间有“讨巧”的嫌疑,因为程序只是将c1_r_array分配到了SHARERAMGS0,而SHARERAMGS0是从 0x000c000开始的4K内存空间,照理说将c1_r_array随机分配到SHARERAMGS0中的任意位置应该都是合理的。只是因为这个程序中只定义了一个唯一的c1_r_array数组在GS0空间,所以在编译器中看上去无论怎么分配都是从0000c000开始。
我的疑问是:
1、以#pragma DATA_SECTION(c2_r_array,"SHARERAMGS1");语句为例,这样分配内存空间是否能保证每次c2_r_array分配的内存空间都是固定的?多次编译后会定义到该内存区段别的地方吗?(当然目前看,GS1中就这一个数组,每次都是从地址起始位置开始分配)
2、如果我加一个数组,比如c3_r_array,也定义到SHARERAMGS1,这样c2_r_array,c3_r_array的内存地址还会每次编译都一样吗?会不会出现不一样的情况?(我理解就算编译器每次分配的地址都一样,但是从理论上这俩数组的地址是可以随机改变的)
3、我可以用RAM_management中这种讨巧的内存分配方式吗?如果RAM_management中的内存定义操作不严谨,我应该如何操作才能将一个数组定义到内存的一个固定区域?