このところ,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は動かないのは確かめたし,今回は止めておこうかな.