我想在我的内存中的精确位置设置浮点矩阵的基址(嵌入式DSP开发)
我想做这样的事情,这是行不通的:
//由于…的挥发性
如果你用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]
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]
如果你想 分配 在固定地址的内存中,必须使用非标准方式并修改链接描述文件。这是特定于编译器/链接器的。
如果已经在该位置分配了内存,并且您知道它是类型的事实 float [100][2] 或者根本没有类型(不受编译器影响),那么你可以使用数组指针:
float [100][2]
volatile float (*example_two)[100][2]; example_two = (volatile float(*)[100][2]) 0x80000000UL;
在gcc的情况下,总是禁用嵌入式系统中的严格别名,只是为了确保编译器在读取DMA缓冲区时不会出现乱码。 gcc -fno-strict-aliasing 。
gcc -fno-strict-aliasing
考虑:
volatile float (*example_two)[2] = (volatile float (*)[2]) 0x80000000;
此声明允许您使用 example_two 好像已经宣布了 float example_two[100][2] 。例如, example_two[i][j] 指元素 j 排 i 。通过创建指向两个元素数组的指针,这省略了 [100] 来自该类型的信息,但通常不需要。
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] 。这更麻烦。
尝试(或不要尝试)这个丑陋 #define 特技
#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