在LINUX下如何给DDR从起始地址0x05877000起到终止地址0x3ffff000位置循环写入0x550xAA,写入完毕后再从DDR的起始地址0x05877000到终止地址0x3ffff000里把刚才写入的数据读取出来,然后比较写入和读取的数据,如果数据完全一致则输出PASS,如果数据不完全一致则输出FAIL。
时间: 2024-02-13 08:59:43 浏览: 143
可以使用Linux下的dd命令来实现这个功能。具体步骤如下:
1. 编写一个脚本文件,比如叫做test_ddr.sh,文件内容如下:
```
#!/bin/bash
# 循环写入数据
for ((i=0x05877000; i<0x3ffff000; i+=4)); do
echo -ne "\x55\x00\xAA\x55" | dd of=/dev/mem bs=4 count=1 seek=$(($i/4))
done
# 读取数据并比较
for ((i=0x05877000; i<0x3ffff000; i+=4)); do
data=$(dd if=/dev/mem bs=4 count=1 skip=$(($i/4)) 2>/dev/null | hexdump -e '/4 "%08x\n"')
if [ "$data" != "5500aa55" ]; then
echo "FAIL"
exit 1
fi
done
echo "PASS"
```
2. 将脚本文件赋予执行权限:`chmod +x test_ddr.sh`
3. 使用root权限执行脚本文件:`sudo ./test_ddr.sh`
注意事项:
- 该脚本需要root权限才能执行,因为它需要访问/dev/mem设备。
- 在命令行中输入该脚本时,需要在当前目录下执行,或者在环境变量$PATH中指定该脚本的路径。
- 该脚本的执行过程可能会比较耗时,具体时间取决于DDR的大小和速度。
相关问题
在linux下如何给DDR 从起始地址0x05877000到终止地址0x3ffff000循环写入0x55 0xAA后再从起始地址0x05877000开始读取刚才写入的数据到终止地址0x3ffff000读取完毕,然后比较写入和读取的数据是否相同,按照百分比显示写入读取的数据相同的数据占总数据比例是多少,然后输出计算出来的百分比,如果数据相同率达到100%则再输出PASE,小于100%则输出fail
这是一个比较复杂的问题,需要分步骤来回答,下面是具体操作:
1. 给DDR循环写入0x55 0xAA
可以使用dd命令来实现往DDR中写入数据,具体命令如下:
```
dd if=/dev/zero of=/dev/mem bs=1 count=1 seek=$((0x05877000)) conv=notrunc
```
该命令将/dev/zero中的数据写入DDR的起始地址0x05877000,bs表示每次写入的字节数,count表示写入的次数,seek表示偏移量,notrunc表示不截断文件,保留原有数据。
循环写入0x55 0xAA的命令如下:
```
dd if=/dev/zero bs=1 count=$((0x3ffff000-0x05877000+1)) | tr "\000" "\125" | tr "\001" "\252" | dd of=/dev/mem bs=1 seek=$((0x05877000)) conv=notrunc
```
该命令使用/dev/zero中的数据循环写入0x55 0xAA到DDR中,bs表示每次写入的字节数,count表示写入的次数,tr命令将0x00替换为0x55,将0x01替换为0xAA,dd命令将替换后的数据写入DDR中,seek表示偏移量,notrunc表示不截断文件,保留原有数据。
2. 从DDR中读取数据并比较
可以使用hexdump命令来读取DDR中的数据,具体命令如下:
```
hexdump -v -e '1/4 "%08x\n"' -s 0x05877000 -n $((0x3ffff000-0x05877000+1)) /dev/mem > data.txt
```
该命令将DDR中的数据读取到data.txt文件中,-v表示输出所有数据,-e表示指定格式,-s表示偏移量,-n表示读取的字节数。
读取数据后,可以写一个脚本来比较写入和读取的数据是否相同,并计算出相同数据的百分比,具体实现可以参考下面的代码:
```
#!/bin/bash
# 计算数据总长度
total_len=$((0x3ffff000-0x05877000+1))
# 读取写入的数据
dd if=/dev/mem bs=1 count=$total_len skip=$((0x05877000)) > write_data.bin
# 读取从DDR中读取的数据
hexdump -v -e '1/4 "%08x\n"' -s 0x05877000 -n $total_len /dev/mem > read_data.txt
# 计算相同数据的长度
diff_len=$(diff write_data.bin read_data.txt | grep "^<" | wc -c)
# 计算相同数据的百分比
percent=$(echo "scale=2; $diff_len/$total_len*100" | bc)
# 输出百分比
echo "相同数据占总数据的百分比:$percent%"
# 判断是否达到100%
if [ $(echo "$percent == 100" | bc) -eq 1 ]; then
echo "PASS"
else
echo "FAIL"
fi
```
以上脚本会将写入的数据和从DDR中读取的数据进行比较,计算出相同数据的百分比,并判断是否达到100%。如果相同数据占总数据的百分比为100%,则输出“PASS”,否则输出“FAIL”。
LINUX下使用SHELL脚本,给起始地址为0x05877000终止地址为0x3ffff000的DDR4写入0x55 0xAA,从起始地址开始,写满一个地址后开始写入下一个地址直到把终止地址0x3ffff000写满后停止。然后从起始地址0x05877000开始读取数据,直到读取完终止地址0x3ffff000内的数据位置。比较写入的所有数据和读取的所有数据,如果写入数据和读取数据完全一致则输出PASS,如果不完全一致,则输出FAIL。最后以百分比的形式输出读取数据和写入数据的一致率。
好的,这是一个关于Linux下使用SHELL脚本的问题,需要写一个脚本实现给起始地址为0x05877000终止地址为0x3ffff000的DDR4写入0x55 0xAA,然后从起始地址0x05877000开始读取数据,比较写入的所有数据和读取的所有数据,输出结果。
下面是一个示例脚本:
```bash
#!/bin/bash
# 定义变量
start_addr=0x05877000
end_addr=0x3ffff000
data=0x55aa55aa
# 写入数据
for ((i=start_addr;i<=end_addr;i+=4)); do
echo $data | dd of=/dev/mem bs=4 count=1 seek=$((i/4)) conv=notrunc >/dev/null 2>&1
done
# 读取数据
for ((i=start_addr;i<=end_addr;i+=4)); do
read_data=$(dd if=/dev/mem bs=4 count=1 skip=$((i/4)) 2>/dev/null | xxd -p)
if [ "$read_data" != "55aa55aa" ]; then
echo "FAIL"
exit 1
fi
done
echo "PASS"
# 计算一致率
total_bytes=$((end_addr-start_addr+1))
same_bytes=$((total_bytes/4))
same_percent=$(echo "scale=2; $same_bytes/$total_bytes*100" | bc)
echo "一致率:$same_percent%"
```
这个脚本会先定义起始地址、终止地址和写入的数据,然后使用循环将数据写入DDR4,接着再使用循环读取数据并比较写入的数据是否一致,最后输出结果和读写一致率。
阅读全文