最近在学习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中的内存定义操作不严谨,我应该如何操作才能将一个数组定义到内存的一个固定区域?
mangui zhang:还要结合CMD
最近在学习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中的内存定义操作不严谨,我应该如何操作才能将一个数组定义到内存的一个固定区域?
Igor An:在CMD文件中开出一块足够大的数据区,取个名字,如:buffRamPlace_cmd,然后在声明变量的地方这样声明一下:
uint16_t c2_r_w_array[256];
#pragma DATA_SECTION(c2_r_w_array,"buffRamPlace_cmd");
这样就指定到这个区域了。
最近在学习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中的内存定义操作不严谨,我应该如何操作才能将一个数组定义到内存的一个固定区域?
user3910573:
回复 Igor An:
这个方法我懂,您没看懂我的意思,我的问题是:
您也说了,在CMD中开辟一个足够大的空间,比如空间名字叫buffRamPlace_cmd,起始地址和长度分别是origin =0x00A000, length = 0x001000 ,长度有4096 Word
而我需要指定空间的数组uint16_t c2_r_w_array[256]只有256 Word长,远小于空间buffRamPlace_cmd大小。
用#pragma DATA_SECTION(c2_r_w_array,"buffRamPlace_cmd");只是将c2_r_w_array指定到了这个内存区域,但是具体在内存的哪个区域如何确定?
我理解这么指定空间,c2_r_w_array即可以是0x00A000+256,也可以是0x00A100+256,也可以是0x00A123+256。
我需要的是确定的将c2_r_w_array定义到一个固定地址地址,0x00A000也可以,0x00A100也可以,0x00A123也可以
#pragma DATA_SECTION(c2_r_w_array,"buffRamPlace_cmd");能实现这种功能吗?我觉得是有问题的,除非我开辟的空间buffRamPlace_cmd大小正好和c2_r_w_array一样
最近在学习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中的内存定义操作不严谨,我应该如何操作才能将一个数组定义到内存的一个固定区域?
Igor An:
回复 user3910573:
user3910573这个方法我懂,您没看懂我的意思,我的问题是: 您也说了,在CMD中开辟一个足够大的空间,比如空间名字叫buffRamPlace_cmd,起始地址和长度分别是origin =0x00A000, length = 0x001000 ,长度有4096 Word 而我需要指定空间的数组uint16_t c2_r_w_array[256]只有256 Word长,远小于空间buffRamPlace_cmd大小。 用#pragma DATA_SECTION(c2_r_w_array,"buffRamPlace_cmd");只是将c2_r_w_array指定到了这个内存区域,但是具体在内存的哪个区域如何确定? 我理解这么指定空间,c2_r_w_array即可以是0x00A000+256,也可以是0x00A100+256,也可以是0x00A123+256。 我需要的是确定的将c2_r_w_array定义到一个固定地址地址,0x00A000也可以,0x00A100也可以,0x00A123也可以#pragma DATA_SECTION(c2_r_w_array,"buffRamPlace_cmd");能实现这种功能吗?我觉得是有问题的,除非我开辟的空间buffRamPlace_cmd大小正好和c2_r_w_array一样
最近在学习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中的内存定义操作不严谨,我应该如何操作才能将一个数组定义到内存的一个固定区域?
Young Hu:
回复 user3910573:
blog.csdn.net/…/78392351
TI中文支持网![TMS320F28379D: 导入例程出现故障Description Resource Path Location Type gmake: *** [gridconnectedinvlclfltr.obj] Error 1 gridConnectedInverterLCLFltr C/C++ Problem-TI中文支持网](https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_C2000_pastedimage1752114958744v1.jpg)


