LuckFox Pico MiniでUbuntuを使ってみる

Ubuntuのインストール

しばらくbuildrootを使っていましたが、デフォルトの状態では、pipが使えないので、OSをUbuntuに変えました。
OSイメージへのリンク(Google Cloud Link)がこ ちらに公開されていて、ubuntuとbuildrootのイメージを使用することができます。
使用したイメージは「Luckfox_Pico_Mini_Ubuntu_SDCard.zip」です。
SDカードへの書き込みツール(SocToolKit.exe)と、書き込み手順がこ ちらに公開されています。
注意点としてSDカードを刺した状態で書き込みツール(SocToolKit.exe)を起動すると、SDカードを認識しません。
書き込みツール(SocToolKit.exe)起動後に、SDカードを刺すと、SDカードを認識します。
また、提供されているイメージにはupdate.imgが含まれていますが、このファイルは書き込み対象から除外する必要が有ります。

SDカードが準備できたら、USB-TTL変換アダプターを本体のデバッグポートに接続します。
GPIOのピン配置はこちらに 公開されていますが、デバッグポートはピン番号4(TX)、5(RX)です。
USB-TTLアダプターをWindowsマシンに接続し、TeraTermを起動してから、ボードのUSB経由で電源を供給します。
ずらずらとブートメッセージが表示されて、ログインプロンプトが表示されます。
初回起動時だけはファイルシステムの拡大を行います。


root/rootとpico/luckfoxのユーザが事前に登録されています。
buildrootと比べるとやはり重たいです。


提供されているUbuntuのバージョンはUbuntu 22.04.3のMinimal Ubuntuです。
Minimal Ubuntuについてはこちらに詳しく紹介 されていますが、通常のUbuntuに比べてインストールされているパッケージが制限されているUbuntuです。
ネットワークに接続した状態でunminimizeコマンドを実行すると、通常版と同じパッケージをインストールすることができます。


Ubuntuでは以下の様に最初からSwapが確保されています。


SwapパーテイションではなくSwapファイルが登録されています。


16GのSDカードを使いましたが、アサインされているパーテイションは7G程度です。
パーテイションサイズの変更はイメージの再構築が必要になります。


末尾のパーティション(mmcblk1p8)は未使用です。
このパーティションは/homeやSwapとして使用することができます。


以下のコマンドで/dev/mmcblk1p8をSwapパーティションとしてマウントすることができます。
$ sudo mkswap /dev/mmcblk1p8
Setting up swapspace version 1, size = 54726455296 bytes

$ sudo swapon /dev/mmcblk1p8
[  105.830584] Adding 53443804k swap on /dev/mmcblk1p8.  Priority:-2 extents:1 across:53443804k SS

$ free -h
               total        used        free      shared  buff/cache   available
Mem:            33Mi        13Mi       2.0Mi       0.0Ki        17Mi        16Mi
Swap:          8.7Gi        15Mi       8.7Gi

/etc/fstabのSwapファイルをコメントアウトして、Swapパーティションを追加してみました。


再起動するとSwapが1Gから7Gになりました。


時間が掛かりますが、python pipも使うことができます。


Google Cloudで提供されているUbuntuのイメージはRNDIS(リモートNDIS)機能が有効になっていて、
USBポートに対して「172.32.0.70」のIPアドレス がアサインされます。
UbuntuのRNDISが提供するIPアドレスは172.32.0.70です。
buildrootのRNDISが提供するIPアドレス(172.32.0.93)とは違うので注意が必要です。


WindowsやLinuxホストのIPアドレスを同じセグメントに変更することで、USBポートを使ったネットワークが使えるようになります。
EthernetもWiFiもないので、これ以外のネットワークインタフェースは有りません。

Windowsマシンを母艦にしたネットワーク共有の手順はこ ちらに有りますが、中国語が混じっていて分かりにくかったので改めて紹介します。
まず最初にPico-MiniをWindowsのUSBポートから給電します。
Ubuntuが立ち上がると、Windows側に「Remote NDIS based Internet Sharing Device」が出現します。


ネットワーク接続を開くと2つ(以上)のネットワークが表示されます。
1つが現在母艦が使用中のネットワークで、「識別されていないネットワーク」がRNDISが作成したネットワークです。
こちらがWiFiを使っているときの表示です。


Ethetnetを使っているときはこのように表示されます。


母艦側のネットワーク(イーサネット/WiFi)のプロパティを開いて共有を有効にします。


「識別されていないネットワーク」のプロパティを開いて、さらにインターネットプロトコルバージョン4のプロパティを開きます。


IPアドレス、サブネットマスクを指定します。


全てのウィンドウをOKで閉じると、この変更が有効になります。
コマンドプロンプトでpingを実行するとPico-Miniにpingが通ります。


次にPico-Mini側で以下の操作を行います。
この部分は、Pico-Miniを再起動すると消えてしまいます。
起動するたびに以下のコマンドを実行する必要が有りますが、こ ちらの手順に従うとPico-Miniの起動時に自動的に設定を行います。
$ sudo route add default gw 172.32.0.100

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    0      0        0 usb0
172.32.0.0      0.0.0.0         255.255.0.0     U     0      0        0 usb0

$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Dec  7  2023 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

$ sudo vi /etc/resolv.conf

nameserver 8.8.8.8 --> これを追加

これでPico-Miniから外部にネットワークが通ります。


外部にネットワークが通ったのでaptデータベースをアップデートしてみました。
ものすごく時間が掛かりますが、無事にアップデートが終わりました。


パッケージをupgradeしてみましたが途中でfaultしてしまいました。
さすがに64Mメモリでは、aptによるパッケージの更新は動きません。


簡単なCソースをコンパイルしてみました。
$ cat a.c
#include <stdio.h>
int main() {
        printf("hoge\n");
        return 0;
}
 
$ cc a.c
/usr/bin/ld: cannot find -lgcc: No such file or directory
/usr/bin/ld: cannot find -lgcc: No such file or directory
collect2: error: ld returned 1 exit status

$ cc --version
cc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gccのインストールが不完全なようです。
そこで、gcc 9とlibc6-devをインストールしました。
$ sudo apt install g++-9 -y

$ sudo apt --reinstall install libc6-dev

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 1

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9  2

$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 1

$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 2

$ gcc --version
gcc (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ --version
g++ (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

これでc/c++コンパイラーが動くようになります。
$ cc a.c

$ ./a.out
hoge



pip本体をアップデートしてみました。
30分以上掛かりますが、pip本体が22.0.2から24.0にアップデートされました。


後はひたすらpipでパッケージをインストールするだけです。
手始めにAdafruit-PlatformDetectをインストールします。
インストールには20分以上掛かりました。


Adafruit-PlatformDetectは動作中のLinuxのチップとボードを自動判定するライブラリです。
以下のスクリプト(platformdetect.py)で、このライブラリの動作を確認することができます。
from adafruit_platformdetect import Detector
detector = Detector()
print("Chip id: ", detector.chip.id)
print("Board id: ", detector.board.id)

Pico-Miniを識別しましたが、unable to resolve hostのメッセージが出ています。
$ sudo -E python3 ./platformdetect.py
sudo: unable to resolve host luckfox: Name or service not known
Chip id:  RV1103
Board id:  LUCKFOX_PICO_MINI

/etc/hostsに127.0.1.1を登録すると、このメッセージは無くなります。
$ sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'

$ sudo -E python3 ./platformdetect.py
Chip id:  RV1103
Board id:  LUCKFOX_PICO_MINI

Adafruit-Blinkaをインストールしてみました。
Adafruit-BlinkaはSPIやI2Cを制御できるpythonライブラリですが、8.44.0以降、インストール方法が変わり、
numpyを同時にインストールするようになりました。
numpyのインストールはものすごく時間が掛かるので、numpyのインストールを行わない8.43.0をインストールしました。
インストールは3分程度で終わりました。


確認のためにpipでインストールしたパッケージを確認します。
Blinkaライブラリと関連するライブラリが登録されています。
RNDISによるネットワーク共有は、pipでライブラリをインストールする程度であれば普通に使えます。


これでBlinkaを使って周辺機器の制御を行うことができます。
Blinkaではこ れらのライブラリを利用することができます。
ssd1306のライブラリも正しく動きます。


現在、こ ちらのW5500のEthernetモジュールを使うライブラリをテスト中です。
CircuitPythonが前提のライブラリですが、HTTPSでなければ(SSLを使わなければ)、Linux標準のCpythonでも動く ようにAdafruitに提案していま す。
これがCpythonでも動けば、Pico MiniでEthernetが使えるようになります。



Swap領域の確保には、SwapファイルとSwapパーティションの2つのやり方が有ります。
なんとなくパフォーマンスが違うように感じたので、同じ条件で実測してみました。
こちらがSwapファイルのパフォーマンスです。
pico@luckfox:~$ time python3 -m pip install -U pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./.local/lib/python3.10/site-packages (24.1)

real    2m25.683s
user    0m8.609s
sys     0m2.210s


pico@luckfox:~$ time python3 -m pip install -U pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./.local/lib/python3.10/site-packages (24.1)

real    1m2.436s
user    0m8.491s
sys     0m2.002s


pico@luckfox:~$ time python3 -m pip install -U pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./.local/lib/python3.10/site-packages (24.1)

real    0m54.301s
user    0m8.423s
sys     0m1.809s



こちらがSwapパーティションのパフォーマンスです。
pico@luckfox:~$ time python3 -m pip install -U pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./.local/lib/python3.10/site-packages (24.1)

real    1m32.176s
user    0m8.583s
sys     0m2.583s

pico@luckfox:~$ time python3 -m pip install -U pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./.local/lib/python3.10/site-packages (24.1)

real    1m28.190s
user    0m8.690s
sys     0m2.399s

pico@luckfox:~$ time python3 -m pip install -U pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./.local/lib/python3.10/site-packages (24.1)

real    1m22.046s
user    0m8.504s
sys     0m2.384s


判断が難しいです。



かなり無理やりですがgcc v9とlibcをインストールして、UnixBenchを実行してみました。
64Mメモリではaptによるパッケージインストールはメチャクチャ時間が掛かります。
aptによるパッケージ追加は実用的ではありません。
$ sudo apt install g++-9

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 1

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 2

# Switch to gcc-9
$ sudo update-alternatives --config gcc
There are 3 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path             Priority   Status
------------------------------------------------------------
  0            /usr/bin/gcc-11   11        auto mode
  1            /usr/bin/gcc-11   11        manual mode
* 2            /usr/bin/gcc-9    9         manual mode

Press <enter> to keep the current choice[*], or type selection number:

$ gcc --version
gcc (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ sudo apt install git libc6-dev

$ git clone https://github.com/kdlucas/byte-unixbench.git

$ cd byte-unixbench/UnixBench

$ ./Run

トータルスコアはPico Maxよりもかなり低い値です。
========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: luckfox: GNU/Linux
   OS: GNU/Linux -- 5.10.110 -- #1 Thu Dec 28 16:08:50 HKT 2023
   Machine: armv7l (armv7l)
   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
   CPU 0: ARMv7 Processor rev 5 (v7l) (48.0 bogomips)

   10:19:18 up  3:51,  1 user,  load average: 1.11, 0.31, 0.32; runlevel Sep

------------------------------------------------------------------------
Benchmark Run: Sat Jun 08 2024 10:19:18 - 10:47:27
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        4479022.4 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     1030.2 MWIPS (10.0 s, 7 samples)
Execl Throughput                                386.6 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks         44382.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           31225.0 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks         16823.9 KBps  (30.1 s, 2 samples)
Pipe Throughput                              330073.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  82323.1 lps   (10.0 s, 7 samples)
Process Creation                               1280.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   1032.5 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    133.7 lpm   (60.1 s, 2 samples)
System Call Overhead                         787754.2 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    4479022.4    383.8
Double-Precision Whetstone                       55.0       1030.2    187.3
Execl Throughput                                 43.0        386.6     89.9
File Copy 1024 bufsize 2000 maxblocks          3960.0      44382.0    112.1
File Copy 256 bufsize 500 maxblocks            1655.0      31225.0    188.7
File Copy 4096 bufsize 8000 maxblocks          5800.0      16823.9     29.0
Pipe Throughput                               12440.0     330073.9    265.3
Pipe-based Context Switching                   4000.0      82323.1    205.8
Process Creation                                126.0       1280.0    101.6
Shell Scripts (1 concurrent)                     42.4       1032.5    243.5
Shell Scripts (8 concurrent)                      6.0        133.7    222.8
System Call Overhead                          15000.0     787754.2    525.2
                                                                   ========
System Benchmarks Index Score                                         171.0



個別のスコアで比較するとFile Copy系の差が大きいです。
特に大きなファイルサイズのコピーは90%以上の差となっています。
これは明らかにメモリの空き領域が影響していると考えられます。
純粋なCPU能力を示すDhrystoneとWhetstoneの差は5%程度であることが分かります。

Pico Mini Pico Max Mini/Max
Dhrystone 2 using register variables 383.8 405.4 95%
Double-Precision Whetstone 187.3 197.8 95%
Execl Throughput 89.9 104.7 86%
File Copy 1024 bufsize 2000 maxblocks 112.1 254.9 44%
File Copy 256 bufsize 500 maxblocks 188.7 203.2 93%
File Copy 4096 bufsize 8000 maxblocks 29.0 440.3 7%
Pipe Throughput 265.3 283.3 94%
Pipe-based Context Switching 205.8 217.7 95%
Process Creation 101.6 119.5 85%
Shell Scripts (1 concurrent) 243.5 279.7 87%
Shell Scripts (8 concurrent) 222.8 256.9 87%
System Call Overhead 525.2 552.8 95%

続く...