開発のヒント
周辺機能、I/O、メモリ
DDRメモリの読込み / 書込みスループットを測る
STM32MP1マイクロプロセッサにはDDRのパフォーマンスを計測するためのペリフェラル”DDR performance monitor”が搭載されています。 このペリフェラルとLinuxでは一般的なパフォーマンス計測ユーティリティである”perf”コマンドを使用することで、DDRメモリの読込み / 書込みスループットを計測することができます。
DDR performance monitorには、パフォーマンス計測のために、下記のカウンタが用意されています。
・32ビット・タイム・カウンタ(TCNT)
・4つの32ビット・イベント・カウンタ(CNT0 to CNT3)
32ビット・タイム・カウンタでは、DDRのクロック・サイクル数を計測します。また、イベント・カウンタでは、設定により、読込み / 書込みイベント回数を計測します。クロック・サイクル数と読込み / 書込みイベント回数を計測することで、DDRメモリの読込み / 書込みパフォーマンスを計測することができます。OpenSTLinuxでは、計測を容易にする「DDR performance monitor」用のドライバおよび「perf」コマンドを同梱しています。
計測の手順は下記をご参照ください。
参考として、計測用シェル・スクリプトを示します。
計測の手順例:
- 「DDR performance monitor」のデバイスツリー設定有効化
「DDR performance monitor」は標準設定では無効に設定されているため、デバイスツリーを変更して、有効にする必要があります。各ボードのデバイスツリー中に下記の記載を追加します。例えばSTM32MP157F-EV1ボードであれば、Linuxソースコード中のarch/arm/boot/dtsディレクトリ内のstm32mp157f-ev.dtsファイルに追記します。
/* enable DDR perfm */
&ddrperfm{
status = “okay”;
}; - デバイスツリーのビルド
デバイスツリーをビルドして*.dtbファイルを生成します。
変更したデバイスツリーをボード中の/bootにファイルコピーします。
(PC) $ scp stm32mp157f-ev1.dtb root@192.168.7.1:/boot - 再起動
- 計測用シェルスクリプトをボードへコピー
(PC) $ scp ddr_test.sh root@192.168.7.1:/boot
ddr_test - 計測用シェルスクリプトを実行
(BOARD) $ chmod +x ddr_test.sh
(BOARD) $ ./ddr_test.sh
より詳細な情報は、参考1をご参照ください。
また、シェルスクリプトの例は、下記参考2をご参照ください。
参考1: wiki
参考2: 計測用シェルスクリプト ddr_test.sh (コピーしてご使用ください)
#!/bin/bash
# test script for DDR perf
count=10
data_size=”64M”
ddr_freq_mz=”533″
i=0
test_data_path=”/mnt/mem/test1″
# mount RAM disk
mkdir /mnt/mem
mount -t tmpfs tmpfs /mnt/mem
# show test header
echo “DDR memory write test”
echo “data size:${data_size}Bytes”
echo “DDR frequency:${ddr_freq_mz}MHz”
echo “test cycle:${count}times”
echo “————————————————————“
# ddr memory write test
while [ $i -lt $count ]
do
file_name=$(printf “perf%02d.txt” $i)
perf stat -e stm32_ddr_pmu/read_cnt/,stm32_ddr_pmu/time_cnt/,stm32_ddr_pmu/write_cnt/ -a -o $file_name dd if=/dev/zero of=$test_data_path bs=$data_size count=1 > /dev/null 2>&1
printf “test%02d\n” $i
python3 /usr/bin/stm32_ddr_pmu.py -f $file_name -d $ddr_freq_mz
echo “————————————————————“
rm $file_name
rm $test_data_path
i=`expr $i + 1`
done
umount /mnt/mem
rmdir /mnt/mem
# test script for DDR perf
count=10
data_size=”64M”
ddr_freq_mz=”533″
i=0
test_data_path=”/mnt/mem/test1″
# mount RAM disk
mkdir /mnt/mem
mount -t tmpfs tmpfs /mnt/mem
# show test header
echo “DDR memory write test”
echo “data size:${data_size}Bytes”
echo “DDR frequency:${ddr_freq_mz}MHz”
echo “test cycle:${count}times”
echo “————————————————————“
# ddr memory write test
while [ $i -lt $count ]
do
file_name=$(printf “perf%02d.txt” $i)
perf stat -e stm32_ddr_pmu/read_cnt/,stm32_ddr_pmu/time_cnt/,stm32_ddr_pmu/write_cnt/ -a -o $file_name dd if=/dev/zero of=$test_data_path bs=$data_size count=1 > /dev/null 2>&1
printf “test%02d\n” $i
python3 /usr/bin/stm32_ddr_pmu.py -f $file_name -d $ddr_freq_mz
echo “————————————————————“
rm $file_name
rm $test_data_path
i=`expr $i + 1`
done
umount /mnt/mem
rmdir /mnt/mem
過去の開発のヒントはこちら