コンパイラによる動作の違い
このところ,UIAPduino用のArduino環境の改良を行っているが, これまではdebian 13上でch32funを使う際にインストールしたriscv64-unknown-elf-gccなどを使ってコンパイルして来た. 私が改良している環境と同じくch32funを使っているAlexanderManderaさんの環境はriscv-none-elf-gccなどを使用している. 一方,WCHやUIAPduinoやSuzuduinoではriscv-none-embed-gccなどを利用している. このように,riscvには幾つかのコンパイラーがあるので,その種類による違いを検証してみた.
これらのパッケージの名称に含まれている elfはExecutable and Linkable Formatの略のようで標準的なパッケージなのを示すのに対して, embedは組み込み用に特化したものを指すようだ. そして,unknownよりもnoneの方が公式の提供元であることを示すようだ. riscv-none-embed-gccは,ch32の開発元のWCH社が出しているパッケージである. riscv-none-elf-gccは,xPackというプロジェクトのものであるようだ. そして,私が使っているriscv64-unknown-elf-gccは,debianプロジェクトが作ったものなのだろう.
すべての機能をチェックするのは大変なので, USB serialとI2Cを使うプログラムをコンパイルして書き込んで,その挙動を比較してみた. まずは,これまで使っていたriscv64-unknown-elf-gccであるが,当然うまく動作する. ちなみに,コンパイルしたときのサイズは15088 bytesであった. 次にriscv-none-elf-gccだが, AlexanderManderaさんの環境がインストールされていれば,別の環境からも使うことができるようで,platform.txt中で以下のような指定をすると,コンパイラを使うことができた.
compiler.path={runtime.tools.riscv-none-elf-gcc.path}/bin/
newlibをincludeしていた部分をいじる必要があったが,喜ばしいことにこれを使っても無事に動いた. サイズは14020 bytesと少し小さくなったが,バージョンが古いからかも知れない. 最後にriscv-none-embed-gccだが,UIAPduinoのファイルを利用して,以下のように指定した.
compiler.path={runtime.tools.riscv-none-embed-gcc-8.2.0.path}/bin/
サイズは14028 byteであったが,残念なことにUSB serialを認識しなかった. I2Cの方の結果をUSB serialで見ているので,I2Cも動いているか分からなかった. コンパイルオプションなどをいじると,もしかしたら動くかも知れないが,大変そうなので試していない. このコンパイラはch32funとの相性が良くないのかも知れない.
結果として,配布パッケージであるriscv-none-elf-gccでも,USBが無事に動くことが確認できた. 簡単にチェックできるtoneやpwmも大丈夫だったし,おそらく他の機能もほぼ動いているだろう. 今後の検証では,このコンパイラを使って行っていこうと思う.
ついでに,Arduinoのversionによる違いについても調べてみた. 私はArduino1.8.19を使っているが,現在はArduino2系列が主流になりつつある. 丁度,立ち上げたばかりのDebian13のPCがあったので,flatpakでArduino2.3をインストールしたら,一旦ファイラーが動かなくなってしまった. 普段使っているPCでやらなくて良かった. udevとdialout groupの設定をして,AlexanderManderaさんの環境をインストールして,Arduino2.3でも試してみたが,ほぼ問題無いように見える. 別のPCでAppImageでも試したが,libfuse2をインストールする必要はあったが,こちらでも問題無いようである.
Windowsでも同じようなコンパイラを使えば動くだろうが,私の手元には確認できる環境が無い. Windowsの入ったPCを買っても,すぐにLinuxを上書インストールしてしまうので. Debianを入れる前のWindowsPCもあるので,試してみたいとも思わないでも無いのだが,Windowsを使って3分ぐらい経つと,耐え切れなくなって使うのを止めてしまうんだよな. USB serialは動かないのは確かめたし,今回は止めておこうかな.