在DDR内存空间中指定地址存放数据

为了实现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开始,也就是程序运行空间的值是乱七八糟的

想了解链接脚本的可以看这篇文章

https://blog.csdn.net/setul/article/details/122898377?ops_request_misc=&request_id=&biz_id=102&utm_term=attribute%E5%88%86%E9%85%8DDDR%E5%9C%B0%E5%9D%80&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-6-122898377.142v99pc_search_result_base4&spm=1018.2226.3001.4187

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值