
8ビット/24MHz動作の「ATmega1284p」プロセッサでARM Linuxを動かす、ログインできるまで6時間 27
ストーリー by hylom
このチャレンジング精神はどこからくるのか 部門より
このチャレンジング精神はどこからくるのか 部門より
90 曰く、
Dmitry Grinbergという男性が、8ビット/24MHz動作の「ATmega1284p」プロセッサでMMUつきARM Linuxをエミュレーションで動作させたという。
Intel XScale PXA255 の Palm Tungsten E2 をエミュレートしているらしい。さすがにちょっと信じられない。自分の目で見るまでは。
メモリバスを持たないATmegaで (スコア:1)
ATmegaのスペック (スコア:5, 参考になる)
知らない人のために書いておくと、ATmega1284のスペック。
Atmelの8bitマイコンはアーキテクチャが共通で、
レジスタ: 8bit×32本 +PC+SP
命令長16bit固定の純RISC的なロードストアアーキテクチャで、1クロック1命令実行。
開発にはgccが使えます。アーキテクチャが素直なので、Cで書いてもそこそこ効率のよいコードになり、あまりアセンブラを使う必要がありません。
プログラムとデータを完全分離したハーバードアーキテクチャなので、データメモリ(SRAM)にある命令コードを実行したり、プログラムメモリ(フラッシュメモリ)にデータアクセスしたりはできません。
だから、定数テーブルとかデータメモリには置けない(初期化手段がない)ので、大きなテーブルを扱いたいときはその取り扱いにちょっと苦労したりします。プログラムメモリにI/Oアクセスで読み書きすることはできるので、プログラムメモリの一部に定数テーブルを置いてI/Oアクセスで取得する感じ。
で、あとは、主にプログラムメモリの量とデータメモリの量、I/Oピンの数でラインナップが分かれています。ATmega1284 [akizukidenshi.com]のスペックは、
プログラムメモリ: 128KB
データメモリ: 16KB
I/Oピン: 32本
というもの。
ATmegaシリーズの中で、DIPパッケージではメモリ量・ピン数最大のものです。
#40ピンのDIPってZ80とかと同じなんだよなぁ…
30ピンSIMMの信号線はアドレス11本データ8本制御線3本の合計23本ですので、I/Oが32本あるからまあ本数的には余裕。それで転送速度は300KB/sぐらいでてるそうです。
あとは、データストレージとしてSDカードをつないでますが、こっちはSPIというシリアル通信規格を使ってますので、低速ながら信号線3本でアクセスできます。といいつつ200KB/sの速度でアクセスできている。
#このぐらいの速度差なら、SDカードをメインメモリに使えばいいんじゃないのかなーとか思いました。アクセス簡単だし。
#でも、30pinSIMMをマイコンにつなぐというのはそれだけでも男の浪漫だよなぁ…
で、全体としては、ARM 6.5kHzぐらいのエミュレーションになってるそうな。
って、さらに読んでると、ARM命令のキャッシュメモリ量を減らす必要はあるけど、ATmega644 [akizukidenshi.com](プログラム64KBデータ4KB)でも、動くって書いてある。
そこまでコンパクトにエミュレータをまとめるってのはすごいなぁ…
#AVRでZ80エミュレータ書きかけて挫折したのでID。
Re:ATmegaのスペック (スコア:4, 参考になる)
> GCC(2年くらい前 3.4.3)はint未満な整数を使うとコードの品質が悪い
気になったのでちょっと調べてみましたが、特に問題なさそうです。
使ったのはWinAVR-20100110(gcc-4.3.3) [sourceforge.net]ですが、
このCコードが、avr-gcc の-Osで、
というアセンブリコードになってます。
> 8bitマイコンではcharの整数をよく使いますが、
Arduinoというマイコンモジュールが、AVRマイコンで開発環境はgcc+ラッパーライブラリという構成なんですけど、
Arduino用のコードを見てると、けっこう long を使っている人が多いんですよね。
(avr-gccでintは16bitなのに、わざわざlong指定で32bitにしてる)
速度やメモリ効率を気にしてないのか、もうなんか富豪的プログラミングがこんなところにまで来ているのかとショックを受けてしまいます。
#まあ、私も8bitパソコン時代にBASICではそこまで細かいデータ型は気にしてなかったし、似たようなものなのかもしれませんが…