100円で買えるマイコンとして、売られているR8Cですが、データシート上は、
RAM256バイト
フラッシュ2Kバイトです
ところが、実際は・・
RAM1366バイト
フラッシュ32Kバイト
まで使えると判り、小躍りしていました~
OS-Xでも、R8Cの開発環境を整える目的で、フラッシュ書き込みプログラムを開発していましたが、
その過程で、R8Cのフラッシュ領域には、まだ拡張された領域があるのでは無いかと思い、良く調べてみました。
すると・・・
0x10000~0x17FFFに、さらに32Kバイトの領域があり、実際に使える事が判明しました。
つまり、フラッシュ2キロバイトとは、見せ掛けの容量で、実際には64キロバイトの領域があります。
※市場では、容量が多く(最大16KB)値段が高いデバイスが存在しますが、基本的に中身は全て同一
なのでしょう・・
考えるに、「ATtiny2313」など100円マイコンと同じレンジのマイコンがラインナップに無いので、
それに相当するデバイスを揃える為に既存のデバイスを再利用したのだと思います、その時、本当の
RAM、ROM容量では、他のラインナップと競合してしまうので、苦肉の索として、100円に釣り
合うと思われる小さい容量で売り出したのでしょう・・
現在のところ、最強の100円マイコンだと思います(笑)
さて、領域がある事が判ったのですが、R8Cのポインターは16ビットなので、基本的には64KB以上の
領域にアクセスするには、工夫が必要です、R8Cは20ビットのアドレス空間までアクセス出来る仕組みが
あるので、アセンブラなら、下駄を履かせてアクセスする方法がありますが、 gcc ではどうでしょうか?
調べてみると、64KB以上のアドレスの関数をコールする為の仕組みがあり、それを使う事で、拡張領域を
使う事が割と簡単に出来るようです。
まず、リンカースクリプトに拡張領域を追加します。
MEMORY { RAM (w) : ORIGIN = 0x00300, LENGTH = 0x00400 ROM (r) : ORIGIN = 0x08000, LENGTH = 0x07FD8 EXT (r) : ORIGIN = 0x10000, LENGTH = 0x08000 VVEC (r) : ORIGIN = 0x0FED8, LENGTH = 256 FVEC (r) : ORIGIN = 0x0FFD8, LENGTH = 40 }
次に、セクション領域を宣言しておきます。
.exttext : { *(.exttext .stub .exttext.* .gnu.linkonce.t.*) KEEP (*(.exttext.*personality*)) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) *(.interp .hash .dynsym .dynstr .gnu.version*) } > EXT =0
これで、ソースコードで拡張領域のセクション指定すれば、通常領域から押し出す事ができます。
※ADC_testで main 関数を押し出してみました。
__attribute__ ((section (".exttext"))) int main(int argc, char *argv[])
コンパイル、リンクも普通に通り、出来上がったバイナリーをデバイスに書き込んでみましたが、普通に動きます。
Motolola Sx format load map: 0x008000 to 0x009225 (4646 bytes) 0x00FF00 to 0x012DB6 (11959 bytes) Total (16605 bytes)