DhrystoneでRaspberry Pi Picoのベンチマークを取る
動作確認
シリアルモニターでDhrystoneプログラムの確認をしますが、シリアルモニターはUartを使います。ここまでプログラム変更をして、いきなりflashしたかの記事になっていますが、実際にはデバッガーを使ってデバッグしながらプログラム変更を行っています(後で触れます)。
その際にUSBシリアルだとプログラムをbreakなどするとシリアル通信が途切れてしまいます。そのためデバッガーを使う際にはUartシリアルを使う必要があります。
Uart配線は「Raspberry Pi Pico “Hello World”実施」でも触れているように以下のようになります。
Raspberry Pi | Raspberry Pi Pico |
GND(Pin 14) | GND(Pin 3) |
GPIO15(UART_RX0, Pin 10) | GP0(UART0_TX, Pin 1) |
GPIO14(UART_TX0, Pin 8) | GP1(UART0_RX, Pin2) |
配線を済ませてUSBケーブルを指し直すとプログラムが走りますが、すぐに終わってしまうのでまずシリアルモニターを起動しておいてからUSBケーブルを差して電源投入します。
1 |
$ minicom -b 115200 -o -D /dev/serial0 |
DMIPS=Dhrystones_per_Second / 1757なので248504.7 / 1757 ≒ 141.4DMIPS、1.06 DMIPS / MHzになりました。
Cortex-M0+は0.93 DMIPS/MHzらしいのでPicoは133MHzなのでカタログ値としては0.93 x 133 = 123.69DMIPSになります。
「DhrystoneでSTマイクロのベンチマークを取る」でもそうでしたが額面通り以上の結果になりました。額面通り以上かはともかく近い値になるのは当たり前かもしれません…
額面通り以上になるということは同じCortex-M0+のSTM32G031K8(pico – nucleo対照表)は64MHzなので0.93 x 64 = 59.52DMIPSくらいになると予想されます。やはりPicoは2倍超の処理能力がありそうです。
ただ私としてはSTマイクロを使い慣れていますし、STマイクロのほうがペリフェラルが充実しているので、一般用途ではSTマイクロ、高CPが求められる場合はPico(RP2040)という選択になるのではないかなと思います。
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
main () /*****/ /* main program, corresponds to procedures */ /* Main and Proc_0 in the Ada version */ { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; /* Initializations */ stdio_init_all(); Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); |
デバッガー
いきなりプログラムを書いて動かしたかのような記事になっていますが、実際にはデバッガーをつないでデバッグしながらやりました。
前回の「Raspberry Pi Picoをデバッガーで動かす」でVSCodeでやるデバッグする記事を書きましたが、実際にやってみると重いし不安定なのでターミナルから実行しました。
「Raspberry Pi Picoでデバッガーを動かす」でOpenOCDやGDBがインストールされていれば後は実行するだけです。
今回も「Getting started with Raspberry Pi Pico」”Chapter 6. Debugging with SWD”を元にやっています。
SWD配線
「Raspberry Pi Picoでデバッガーを動かす」でやったようにSWDも配線します。
上の記事で作ったbuildディレクトリーはいったん削除してDebugバージョンでbuildし直します。
1 2 3 4 5 6 7 |
$ cd ~/pico-exam/dhrystone/ $ rm -rf build $ mkdir build $ cd build $ export PICO_SDK_PATH=~/pico/pico-sdk $ cmake -DCMAKE_BUILD_TYPE=Debug .. $ make -j4 |
OpenOCDをスタートします。
1 |
openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg |
別のターミナルを開き、gdbをスタートします。
1 |
~/pico_exam/dhrystone/build $ gdb-multiarch dhrystone.elf |
GDBをOpenOCDに接続します。
1 |
(gdb) target remote localhost:3333 |
dhrystone.elfをロードして走らせます。
1 2 3 4 5 6 |
(gdb) load Loading section .boot2, size 0x100 lma 0x10000000 ... (gdb) monitor reset init (gdb) b main (gdb) continue |
これでmainの先頭でbreakしています。
以下はコマンドを使ってデバッグしていきます。
1 2 3 4 5 |
(gdb) continue /* プログラムを再開 */ (gdb) b 100 /* 100行目にbreak pointをセット */ (gdb) break 1 /* 1つ目のbreak pointを削除 */ (gdb) next /* step over */ (gdb) print user_Time /* user_Timeの内容を表示 */ |
終わり