RL78も、UARTが動作し始めた事で、佳境に入った感が出て来た。
とりあえず、現在使ってみた感想を述べてみる~
・バイナリーは、R8Cより少なくなる感じではあるけど、基本内部は8ビット構成な
ので、16ビットや32ビットを扱うと、肥大化は免れない。
・ミラー領域のおかげで、64K領域を超えた場合も、ある程度普通に扱う事が出来る。
・32MHzで動作するので、速度面でもかなり有利に感じる。
・RL78/G13は、コアは「S-2」なので、掛け算や割り算命令は無いものの、
外部に「乗除積和算器」があり、コンパイラオプション「-mmul=g13」で、コンパイラ
はこのリソースを使う為、それなりの速度で動作する。
※但し、割り込みルーチン内で使う場合には注意を要すると思われる。
・トータルメモリーのサイズから考えると、コストパフォーマンスに優れている。
・消費電力が非常に小さい。
いつもは、LED点滅の後くらいに、インターバルタイマーを実装するけど、RL78
のインターバルタイマーは、1ユニットで、12ビットレンジ、低速で、シンプルすぎ
るので、イマイチ意欲が沸かなかったが、必要な機能ではあるので、粛々と実装した、
動いた。
ただ、残念なのは、カウンターの値を読み出す事が出来ないので、正確なタイマーを実
装したい場合などに使えない。
単に設定したインターバルを待つだけのものでしか無い。
-----
ついでなので、ソフトディレイも実装した。
RL78/G13では、32MHz動作なので、より細かい単位も可能だけど、とりあえ
ず良く使うだろう、1uS(1マイクロ秒)単位の関数にした、これは、R8Cと同じ仕
様。
最初、アセンブラは、覚えなくても良いとか言ってたけど、結局、なんだかんだで、覚え
る必要が出てきて、ソフトウェアーマニュアルを読む事になった・・・
void micro_second(uint16_t us) { while(us > 0) { --us; } }
上のようなコードは、最適化(-O2)して、以下のように展開される
(2) decw 0xffef0 (1) movw ax, 0xffef0 (1) cmpw ax, #0 (1) skz (3) br !!4922 <.L629>
最適化されても、ワークメモリーが使われているが、マシンサイクルから考えると、なる
ほど、ペナルティーは意外と少ない。
RL78のような、アーキュムレーターが基本のCPUでは、レジスターだけに割り振る
コードを出すのは難しいのかもしれない・・
※()内がマシンサイクル
この結果を考慮して、全体で32クロックになるように「nop」命令を置く。
・次のコードで実験してみた。
while(1) { utils::delay::micro_second(10); P4.B3 = !P4.B3(); }