50円のRISC-VマイコンのCH32V003F4P6ですが、最近、ネット上でいろいろな人が使っていますね。

50円のマイコンで、開発環境が750円とか、確かに広がるのも分かる気がします。

 

RISC-Vなのですこし勉強をしながら進む必要がありますが、はやくやればそれだけ次に進みますので私も理解を進めていきたいと思います。

 

前回はスタートアップコードの割り込みベクタ部分を見ましたが、今回は、後半の初期化を見ていきます。

全体でも以下のように1ページ程度で見渡すことが出来ます。

 

まずは.optionについて先に確認します。norelaxはアセンブラによるコードシーケンスの変更を不許可にします(RISC-Vはアセンブラで最適化する項目がどうも多いようです)。

pushとpopはオプションをいったん保存して、あとで再利用することが出来るセットになります。今回の例では、PUSHした後に、norelaxを指定して、その後、POPして戻しています。

そうしてみると、    la gp, __global_pointer$は1命令だけど、何を指定しているの?って話になります。実は、laは疑似命令です。実際には、2つの命令に分離されます。そうしたことを理解すると意味が少しずつ解ってきます。

 

なんで、疑似命令を使うのか?これは、GPレジスタ(x3)はメモリアクセスする時のベースアドレスとして使用します。当然レジスタは32ビットです。

しかし、そこに32ビットの値を代入することが出来る命令は有りません。

そのため上位をセットするAUIPC命令と下位ビットをセットするADDI命令を2つセットで使います。

 

次にラベルとジャンプ命令(B**)の話をします。

以下のアセンブラではローカルラベルと言うものが使われており、同じ名前のラベルが何度も使われています(1とか2)。B**命令で1b,2fなどと使っています。

下図のような関係になりますので、これは覚えておくと便利です。

 

 

この部分の説明をコード上に記載しました。オレンジ色のところは個別に説明したほうが思うので、次で説明します。

 

こうやって読み込んでいくと、自分でもわかっていない点がおおいな!と思って読んでます。

アセンブラとかで分かりにくい?と思うかもしれませんが、これこそ慣れると理解がすすみますし、マイコンの細かい所も理解しやすくなります。