ぐだぐだ低レベルプログラミング(32) RISC-V、RV32Iシフトあれどもローテイト無

shiftEC
Joseph Halfmoon

今回は、シフト命令を使って行きたいと思います。ハッキリ言ってシフト系の命令冷遇されています。16ビットの圧縮命令にエンコードしてくれるオペランドは限られているし、ローテイト命令など基本命令セットであるRV32Iには含まれとりません。最低限必要なものは用意したので、後はコンパイラでよしなに、という感じですか。

“ぐだぐだ低レベルプログラミング(32) RISC-V、RV32Iシフトあれどもローテイト無” の続きを読む

ぐだぐだ低レベルプログラミング(31) RISC-V、ADDとSUBも凸凹じゃけんの

AddSub_EC
Joseph Halfmoon

前回は、論理演算 and命令を使って、オペランドによって生成される命令がRV32Iだったり、RV32Cになったりするのを目にしました。今回は算術演算 add と sub です。RISC-Vに「直交的な」エンコーディングを想像してはなりませぬ。今回は2つの命令の「割り切った」関係を観察したいと思います。割り算じゃないけど。

“ぐだぐだ低レベルプログラミング(31) RISC-V、ADDとSUBも凸凹じゃけんの” の続きを読む

ぐだぐだ低レベルプログラミング(30) RISC-V、AND命令に隠された?凸凹

Joseph Halfmoon

前回、RISC-Vにmv(move)命令は実は無いのだ、という衝撃?の事実をおさらいしました。今回は、and(論理積)命令です。andみたいなプリミティブな操作の命令に何か細工をする余地などあるのか?ま、当然「工夫」があるわけですが。でもね、andとorとxorは一緒、流石に。1回で3命令進捗!

“ぐだぐだ低レベルプログラミング(30) RISC-V、AND命令に隠された?凸凹” の続きを読む

ぐだぐだ低レベルプログラミング(29) RISC-VでMV(MOVE)命令、本当は無い

StartDebug
Joseph Halfmoon

前回、RISC-Vのアセンブラを再開できたので、今回からは1命令づつ命令を動かしていきたいと思います。最初はMOVE(RISC-VのニーモニックではMV)命令です。単なるレジスタ間の転送。しかし、そこにある「仕掛け」をみるとRISC-Vのやり方というものが理解できる感じがします。単なるMOVE、されどMOVEか。クセが強いのう。

“ぐだぐだ低レベルプログラミング(29) RISC-VでMV(MOVE)命令、本当は無い” の続きを読む

ぐだぐた低レベルプログラミング(28) RISC-Vでアセンブラ再開、環境のレストア

Joseph Halfmoon

昨年は結構RISC-Vマイコンを動かしていたのですが、RISC-V debuggerをボードから外してしまった後「疎遠」となっておりました。今回開発環境をレストア(といってデバッガ取り付けるだけですが)し、再び取り組んでみたいと思います。目標はRV32I全命令を動かしてみること。全命令というと大変そうですがRISC-Vだもんね。

“ぐだぐた低レベルプログラミング(28) RISC-Vでアセンブラ再開、環境のレストア” の続きを読む

ぐだぐだ低レベルプログラミング(27) IARのIDEでArmのアセンブラを

IAR EWARM
Joseph Halfmoon

以下の投稿にてNuvoton社の古めの評価ボードNUC120をIAR社の環境で動かすことに成功したのでした。かなりトラブッたあげく。

鳥なき里のマイコン屋(104) Nuvoton、NUC120 Lチカへの遠い道

が、しかし、予想以上に無料評価版ソフトの容量制限キツイです。調子にのって色々周辺回路を動かしてみるつもりだったですが容量辛い。この環境をどう「活用」したものか?

“ぐだぐだ低レベルプログラミング(27) IARのIDEでArmのアセンブラを” の続きを読む

ぐだぐだ低レベルプログラミング(26) タイマ割り込みをかけながら

TIMER5 interrupt
Joseph Halfmoon

前回はソフトウエアループで500Hzの波形を作ってハード的にCPUクロックの速さを「確かめ」ました。しかし、定周期で周辺装置を駆動する場合などは、ソフトでタイミング作っていたのでは他の仕事ができません。そこで今回はタイマと割り込みを使って「同じような」波形を作ってみたいと思います。 “ぐだぐだ低レベルプログラミング(26) タイマ割り込みをかけながら” の続きを読む

ぐだぐだ低レベルプログラミング(25) 低レベルプログラミングの友、オシロ

Digilent Analog Discovery 2
Joseph Halfmoon

問題含みの前々回、第23回で『後で実行クロックを一応実測しておきます』と書いてしまった(?)ので、今回は測ってみました。低レベルプログラミングでは、CPU内蔵のサイクルカウンタ類は勿論、ICEなどの開発ツールが提供する時間計測機能などが活躍するシーンも多いですが、「真実の友」はオシロスコープじゃないかと思います。「見ればわかる」ことは多い。

“ぐだぐだ低レベルプログラミング(25) 低レベルプログラミングの友、オシロ” の続きを読む

ぐだぐだ低レベルプログラミング(24) 訂正!GD32VF103、遅かったのは私のバグ

RISC-V GD32VF103VBT6 board marking
Joseph Halfmoon

早速の訂正であります。昨日、RISC-V搭載マイコンGD32VF103のメモリアクセス思ったより遅いじゃん、などとディスってしまいましたが、大間違いでした。申し訳ありません。私のバグです。9サイクルと書いていたところ、実際は2サイクルです。 “ぐだぐだ低レベルプログラミング(24) 訂正!GD32VF103、遅かったのは私のバグ” の続きを読む

ぐだぐだ低レベルプログラミング(23) GD32VF103、メモリアクセスを測る

memory load cycle measurement
Joseph Halfmoon

前回は、RISC-Vのサイクルカウンタを使って、GD32VF103の基本的な実行性能を測ってみました。そこで印象的だったのは、コードはFlashに置かれているのに、分岐しても特に大きな性能低下もなく、毎回きっちり同じ実行時間で処理されていることでした。シングルコア(シングルハードスレッド)のマイコンとしては、良い性質じゃないかと思います。今回は、データに対するメモリアクセスを調べてみます。 “ぐだぐだ低レベルプログラミング(23) GD32VF103、メモリアクセスを測る” の続きを読む

ぐだぐだ低レベルプログラミング(22) GD32VF103、サイクルカウンタ実測例

Joseph Halfmoon

前回、GD32VF103のRISC-Vコアのサイクルカウンタを動かせるようになったので、今回は短いコードについて測定してみて感触を確かめたいと思います。「たかが」サイクルカウンタと言っても「高等な」マシンだと、いろいろあったりするので。シンプルなシステムなので素直に使えるとよいなあ。 “ぐだぐだ低レベルプログラミング(22) GD32VF103、サイクルカウンタ実測例” の続きを読む

ぐだぐだ低レベルプログラミング(21) GD32VF103のサイクルカウンタ辺の実装

Joseph Halfmoon

「RISC-V原典」を読んだので(といって全部きちんとじゃないですが)、再び、RISC-Vのアセンブラと戯れてみたいと思います。最初の疑問は、「図3.3 ゼロ・レジスタであるx0を利用したRISC-Vの32個の疑似命令」という表に掲げられている rdinstret, rdcycle, rdtimeという3つの「疑似命令」についてです。x86の場合の rdtsc と似たもの共、と言えば「アセンブラ関係者」の方はお分かりと思います。 “ぐだぐだ低レベルプログラミング(21) GD32VF103のサイクルカウンタ辺の実装” の続きを読む

ぐだぐだ低レベルプログラミング(20) RISC-V、nop、mv、li??

JosephHalfmoon

別シリーズに (93) (94) (95) とRISC-Vのアセンブラねたを仕込んでしまいました。一応、アセンブラは「こちら」というこで引っ越しをすることにいたしました。今後はRISC-Vのアセンブラねたはこちらということでお願いいたします。ま、どちらでも大した違いはないんでありますが。しかし、何か月ぶりのシリーズ再開だ? “ぐだぐだ低レベルプログラミング(20) RISC-V、nop、mv、li??” の続きを読む

ぐだぐだ低レベルプログラミング(19) Arm NEONをつかってみる4

ようやくコンパイラにNEONのクワッドワードのレジスタを使うコードを吐き出してもらえるようになったので、わずかにハードルを上げてみたいと思います。当初から予定通りで、内積計算ですね。ベクトルの要素毎に単純な掛け算をしているのと比べると、それらの和をとっていかなければならないので、計算はちょっとだけ複雑。それに何と言っても結果はスカラー。コンパイラはどのように料理してくれるのでしょうか。

“ぐだぐだ低レベルプログラミング(19) Arm NEONをつかってみる4” の続きを読む