为了实现PS与PL端交互时,数据存放在指定地址,并且不被其它变量、程序干扰,可以通过以下的方法
1.对于单个变量可以采用指针的方法
int* p=(int*)(0x100000);
2.如果需要将数组写入指定地址,可以采用:
// 假设有一串数据存储在数组 data[] 中,数据长度为 data_length
// 假设 MOTOR_VALUE_BASEADDR 是你设置的内存段地址
volatile int *motor_values = (volatile int *)MOTOR_VALUE_BASEADDR;
for (int i = 0; i < data_length; ++i) {
motor_values[i] = data[i];
}
但是motor_values并不是真正的数组,motor_values[i] 使用指针 motor_values 加上偏移量 i 访问内存中的位置,而不是通过数组名直接访问。
==而数组空间不会被程序其他部分占用,但是如果使用指针,那么可能会和其他变量、寄存器或系统重要的内存空间发生冲突。==这个不是完美的方法
所以想要在指定地址定义数组需要在链接脚本(也就是lscript.ld)里进行配置
如图所示,方框1里面是我通过Add Memory定义的5个地址空间(包含基地址与地址大小信息),注意地址不能重复,定义完成后就点击方框2,如下图所示
在MEMORY中就会自动定义好五块地址,当然也可以直接在里面编辑,格式:
motor1_value : ORIGIN = 0x100000, LENGTH = 0x100000
然后需要在SECTIONS中手动添加
格式:
.motor1_value : {
__motor1_value_start = .;
*(.motor1_value)
__motor1_value_end = .;
} > motor1_value
这样就定义完成了
测试一下
#include "stdio.h"
#include"xil_printf.h"
u32 motor1_value[262144] __attribute__((section(".motor1_value")));
int main()
{
int k=0;
for(int i=0;i<sizeof(motor1_value);i++){
motor1_value[i]=k%1024;
k++;
}
}
其中就相当于定义了一个motor1_value[262144]数组在.motor1_value内存空间中,其值为262144是因为之前定义的地址大小为0x100000,相当于可以存储1048576 BYTE数据,也就是262144个32位数据,如果大于262144编译时会报错
图中可以看出数组的首地址为0x100000,与定义的一致
并且空间中的初始值都为0,没有被程序干扰
上图可以看出,从0x600000开始,也就是程序运行空间的值是乱七八糟的
想了解链接脚本的可以看这篇文章