如何设置矩阵的基址?

时间:2018-12-12 12:53:30

标签: c embedded

我想在内存中的精确位置设置一个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;

有可能吗?

4 个答案:

答案 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;

请参阅https://ideone.com/7c6dJ9

上的工作示例