我想在内存中的精确位置设置一个float矩阵的基地址(嵌入式DSP开发)
我想做这样的事情,这是行不通的:
// volatile because of the DMA filling the array automatically
// base address is 0x80000000
volatile float example_two[100][2] = (volatile float *)0x80000000;
我知道我可以为这样的指针做这件事,但是我会松开数组大小([100] [2]):
// volatile because of the DMA filling the array automatically
// base address is 0x80000000
volatile float *example_one = (volatile float *)0x80000000;
有可能吗?
答案 0 :(得分:2)
如果要在固定地址分配内存,则必须使用非标准方式,还必须修改链接描述文件。这是特定于编译器/链接器的。
如果已经在该位置分配了内存,并且您知道它的类型为float [100][2]
,或者根本没有任何类型(编译器未触及),那么可以使用数组指针:
volatile float (*example_two)[100][2];
example_two = (volatile float(*)[100][2]) 0x80000000UL;
在使用gcc的情况下,请始终禁用嵌入式系统中的严格别名,以确保例如在读取DMA缓冲区时编译器不会陷入麻烦。 gcc -fno-strict-aliasing
。
答案 1 :(得分:1)
考虑:
volatile float (*example_two)[2] = (volatile float (*)[2]) 0x80000000;
此声明使您可以像使用example_two
一样使用float example_two[100][2]
。例如,example_two[i][j]
引用行j
的元素i
。通过创建指向两个元素的数组的指针,这会忽略类型中的[100]
信息,但这通常是不需要的。
另一种选择是写:
volatile float (*example_two)[100][2] = (volatile float (*)[100][2]) 0x80000000;
这包括完整的类型信息,但是必须像(*example_two)[i][j]
中那样取消引用才能使用。这比较麻烦。
答案 2 :(得分:-1)
如果您将这些陈述用c语言表达,
volatile float *example_one = (volatile float *)0x80000000;
在这里,您将指向指定位置的指针。
如下所示,
volatile float example_two[100][2]
创建一个数组。发生内存分配。所以它们是不同的陈述。
在这种情况下,您可以创建一个指向数组的指针,然后尝试使用
volatile float (*example_two)[100][2] = (volatile float *)0x80000000;
您需要以(*example_two)[i][j]
答案 3 :(得分:-1)
尝试(或不要尝试)这个丑陋的#define
技巧
#define example_two (*donttrythisathome)
float example_two[100][2] = (void*)0xDEADBEEF;
example_two[42][0] = example_two[42][1] = -0.42;
上的工作示例