はじめに
ラズベリーパイ3、4などの無線機能付きの機種ではデフォルトではデバッグシリアルが無効化されている。 これは2種類あるUARTのうちPL011をBluetooth制御に割り当てるようになっているため。
ラズベリーパイ4に関してはUART2〜5としてPL011が追加されているがこれらもデフォルトで無効化されている。 さらにこちらは、UART0/1とは異なるGPIOピンヘッダ上のピンに引き出されている。
ラズベリーパイ Zero, 1,2,3は以下のようになっている。
Name | Type |
---|---|
UART0 | PL011 |
UART1 | mini UART |
ラズベリーパイ4は以下のようになっている
Name | Type |
---|---|
UART0 | PL011 |
UART1 | mini UART |
UART2 | PL011 |
UART3 | PL011 |
UART4 | PL011 |
UART5 | PL011 |
どちらの場合もデバッグシリアルを使用したい場合は、mini UARTを有効化する必要がある。
mini UARTの問題点
mini UARTは名前から察せられる通り、PL011と比較して機能が限定されたUARTのペリフェラルとなっている。
その上、ボーレートがcore_freq
で指定されるGPUのコアクロックの周波数に影響されるため、このクロックを固定しないと通信が不安定になる。
この点に関してはラズベリーパイのドキュメントに下記の記載がある。
In order to use the mini UART, you need to configure the Raspberry Pi to use a fixed VPU core clock frequency. This is because the mini UART clock is linked to the VPU core clock, so that when the core clock frequency changes, the UART baud rate will also change.
Mini UART set to | core clock | Result |
---|---|---|
primary UART | variable | mini UART disabled |
primary UART | fixed by setting enable_uart=1 | mini UART enabled, core clock fixed to 250MHz, or if force_turbo=1 is set, the VPU turbo frequency |
secondary UART | variable | mini UART disabled |
secondary UART | fixed by setting core_freq=250 | mini UART enabled |
config.txtに「enable_uart=1」と記述した場合、次のようになる。
- プライマリUARTがmini UARTになる
- mini UARTが有効化される
- coreクロックが250MHzに固定される(force_turbo=1の場合はVPUターボ周波数に固定)
VPUターボ周波数が何Hzなのかはここには記載はないので省略する。
ここで問題なのは、コア周波数(core_freq)が250MHzに固定されるということ。
Overclockingの説明によると、core_freqはこのようなものらしい。
Frequency of the GPU processor core in MHz. Influences CPU performance because it drives the L2 cache and memory bus;
GPUプロセッサコアの周波数で、L2キャッシュとメモリバスを駆動するためCPUのパフォーマンスに影響するとのこと。
つまりcore_freqを固定すると性能に影響がある。
実機計測
core_freqの実際の値を実機上で計測するにはvcgencmd
コマンドを使用する。
# vcgencmd measure_clock core
ラズベリーパイ4
ラズベリーパイ4での実行結果。
root@raspberrypi4-64:~# vcgencmd measure_clock core frequency(1)=500000992
約500MHzで固定されている。
一応リビジョンも確認すると、Rev 1.2となっている。
root@raspberrypi4-64:~# cat /proc/cpuinfo | grep Rev Revision : c03112 Model : Raspberry Pi 4 Model B Rev 1.2
ラズベリーパイ3
ラズベリーパイ3での実行結果。
root@raspberrypi3-64:~# vcgencmd measure_clock core frequency(1)=400000000
約400MHzで固定されている。
何回か実行してもだいたい似たような値になる。
結果
通常、core_freqの変動範囲はcore_freq_min
から機種ごとの最大値の間となっている。
Overclockingの表の抜粋を以下に示す。
Pi3 | Pi4B >= R1.3 | Pi4B R1.4 | 備考 | |
---|---|---|---|---|
core_freq | 400 | 500 | 500 | デフォルト値 |
core_freq_min | 250 | 200 | 200 | 最低値 |
最大値の記載は見つからなかった。
ここまでの結果から、enable_uartで固定されるcore_freqの周波数は250MHzではなく、それぞれの機種のcore_freqのデフォルト値で固定されていることがわかる。
ドキュメントのIssue
ラズベリーパイのドキュメントのリポジトリでは このことについて「[Pi 4B] enable_uart / overclocking documentation unclear #1614」 のように報告されている。
Based on uart.md, one gets the impression that setting enable_uart=1 fixes the core clock to 250MHz. However, it appears that on the Pi 4B, enabling this option appears to fix the core clock to 500MHz.
ただしその際には具体的な変更は行われずに、下記の理由でクローズされている。
Inclined to close, then repair/fixup on the new site if its still a problem.
つまり、問題は認識しているが実際には修正されていないという状態のようだ。また、このIssueではラズベリーパイ4 Model Bについてのみ言及されているが、 今回の実験結果から、ラズベリーパイ3 Model Bについても似たような状態になっていると考えられる。
まとめ
- enable_uartではcore_freqが固定される
- 実際にはドキュメントと異なっており250MHzではなく機種ごとのデフォルト値で固定される
- ドキュメントについてはIssueが立てられたがWon't Fixでクローズされた様子
- mini UART使用時については性能面より消費電力のほうが問題になりそう