パスワードを忘れた? アカウント作成
2411011 story
ハードウェアハック

8ビット/24MHz動作の「ATmega1284p」プロセッサでARM Linuxを動かす、ログインできるまで6時間 27

ストーリー by hylom
このチャレンジング精神はどこからくるのか 部門より
90 曰く、

Dmitry Grinbergという男性が、8ビット/24MHz動作の「ATmega1284p」プロセッサでMMUつきARM Linuxをエミュレーションで動作させたという。

Intel XScale PXA255 の Palm Tungsten E2 をエミュレートしているらしい。さすがにちょっと信じられない。自分の目で見るまでは。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • まあ30pin SIMMならアドレスバス8bit データバス8bitですむか。バースト転送も無いしな。でもすげーOS/360も余裕で動きそうだな
    • ATmegaのスペック (スコア:5, 参考になる)

      by taka2 (14791) on 2012年04月03日 11時14分 (#2128613) ホームページ 日記

      知らない人のために書いておくと、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。

      親コメント
      • by taka2 (14791) on 2012年04月03日 19時07分 (#2128946) ホームページ 日記

        > GCC(2年くらい前 3.4.3)はint未満な整数を使うとコードの品質が悪い

        気になったのでちょっと調べてみましたが、特に問題なさそうです。
        使ったのはWinAVR-20100110(gcc-4.3.3) [sourceforge.net]ですが、

        char func(char val) {
            if (val > 0) {
                return 0;
            } else {
                return 0xff;
            }
        }

        このCコードが、avr-gcc の-Osで、

            88 23           and    r24, r24
            11 f4           brne    .+4          ; <func+0x8>
            8f ef           ldi    r24, 0xFF    ; 255
            08 95           ret
            80 e0           ldi    r24, 0x00    ; 0
            08 95           ret

        というアセンブリコードになってます。

        > 8bitマイコンではcharの整数をよく使いますが、

        Arduinoというマイコンモジュールが、AVRマイコンで開発環境はgcc+ラッパーライブラリという構成なんですけど、
        Arduino用のコードを見てると、けっこう long を使っている人が多いんですよね。
        (avr-gccでintは16bitなのに、わざわざlong指定で32bitにしてる)
        速度やメモリ効率を気にしてないのか、もうなんか富豪的プログラミングがこんなところにまで来ているのかとショックを受けてしまいます。

        #まあ、私も8bitパソコン時代にBASICではそこまで細かいデータ型は気にしてなかったし、似たようなものなのかもしれませんが…

        親コメント
      • 1個のコメント が現在のしきい値以下です。
typodupeerror

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

読み込み中...