開発のヒント

周辺機能、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」コマンドを同梱しています。

計測の手順は下記をご参照ください。
参考として、計測用シェル・スクリプトを示します。

計測の手順例:

  1. 「DDR performance monitor」のデバイスツリー設定有効化 「DDR performance monitor」は標準設定では無効に設定されているため、デバイスツリーを変更して、有効にする必要があります。各ボードのデバイスツリー中に下記の記載を追加します。例えばSTM32MP157F-EV1ボードであれば、Linuxソースコード中のarch/arm/boot/dtsディレクトリ内のstm32mp157f-ev.dtsファイルに追記します。
    /* enable DDR perfm */
    &ddrperfm{
       status = “okay”;
    };

  2. デバイスツリーのビルド
    デバイスツリーをビルドして*.dtbファイルを生成します。
    変更したデバイスツリーをボード中の/bootにファイルコピーします。
    (PC) $ scp stm32mp157f-ev1.dtb root@192.168.7.1:/boot

  3. 再起動

  4. 計測用シェルスクリプトをボードへコピー
    (PC) $ scp ddr_test.sh root@192.168.7.1:/boot
    ddr_test

  5. 計測用シェルスクリプトを実行
    (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

過去の開発のヒントはこちら