パスワードを忘れた? アカウント作成
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 Anonymous Coward

        8bitマイコンではcharの整数をよく使いますが、GCC(2年くらい前 3.4.3)はint未満な整数を使うとコードの品質が悪いように見えました。最近のは問題ないですか?

        なんかCのルールを愚直に実装したようなintへの格上げを行いがちでしたね。同じようなコードでも、たまに最適化がかかってたりして、わけが分からなかった。

        例えば、char aをa > 0と比較するとaを16bit整数に拡張してから比較するコードが出来てたりしました。たまに8bitのまま比較するコードが出来てたりするんですよね。

        たしか、PCでも同じ感じだったから、アーキテクチャには依存しないと思う。

        • 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ではそこまで細かいデータ型は気にしてなかったし、似たようなものなのかもしれませんが…

          親コメント
          • by Anonymous Coward

            わざわざ調べてくれてありがとう。

            久しぶりにちょこっと見直して見たんだけど、それらしいのは1例しか見つからなかった。
            問題が出やすいのは-O3とかの時だったか、もっと昔のGCCだったかな?
            記憶が結構怪しいようです。

            で、avr-gcc 4.5.3でコンパイルしなおしたら、その1例も消えました。

    • しかもその16本をAtmegaの各IOピンに直接繋いでる辺りに、作者のこだわりを感じます。
      DRAMリフレッシュにはCPU時間の3%も割かれてるようで、ハードウェアだけ見るとまるでメモリドライバみたいですね。

      親コメント
    • by Anonymous Coward

      データバス・アドレスバスだけでなく、R/W制御信号などの制御線も必要になると思います。
      データバスを削ると転送回数が増えて性能低下に直結するので、削るならアドレスバスかな。
      アドレスバス8bitでも厳しいけど。

  • by Anonymous Coward on 2012年04月03日 9時48分 (#2128545)

    8bitじゃないけど、低スペックのCPUで動かすものとしたら
    Microchip PIC32 [microchip.com]で動作する2.11BSD「retrobsd [google.com]」
    ・Gameboy Advanceで動作するUNIX® on the Game Boy Advance [kernelthread.com]

    • この試みはスキルアップ目的と技術デモでしょう。凄いけど実用にはならないが
      開発を通して得た副産物はいろいろと応用が効きそうな気もします。

      ほんとに使おうと思うなら、そういったものとか、MSX上で作られたVersion 7 UNIX
      クローンのUZIX
      http://www.nodus.ne.jp/ghost/msx/uzix-j.html [nodus.ne.jp]
      なんていうのもありましたが、こういうのがいいんでしょうね。あとuClinuxも16ビットで
      動いたから、その辺をなんとかしてみるとか。

      MSXやかつてのPC-6001シリーズあたりはゲームから入れる敷居の低さと、
      抽象度が低いということで年少者の格好の教材になってて、いまならマイコンボードが
      その代わりになってくれるといいんだけど、ハードハードしたイメージがあるので
      ちょっと敷居が高いのが難点ですか。いまのPCとそのOSは抽象度が高くて
      低レベルな所のスキルアップに向いてないですから何か代わりにあるのがあると
      いいかなと思うんですけど。

      親コメント
      • by Anonymous Coward

        > MSXやかつてのPC-6001シリーズあたりはゲームから入れる敷居の低さと、
        > 抽象度が低いということで年少者の格好の教材になってて、いまならマイコンボードが

        そのへんだと、最近では任天堂DSi/3DSで DSiウェアの「プチコンmkII」という選択肢もあったりします。
        年少者よりもオッサンが群がっている気がしますがw

  • by Anonymous Coward on 2012年04月03日 7時17分 (#2128481)

    デバイスのエミュレーションはたしかに面倒くさいのだが、根気以外に必要なものもなさそうだ
    エミュレーションホストのほうに著しい制限があるのか?

    おっちょこちょいのために言っておくと、disっているわけではないので

    • by Anonymous Coward on 2012年04月03日 9時04分 (#2128529)

      その根気が、尋常じゃない根気だろうから、それだけでもすごいと思うけど、
      あとは、他コメントにあるけどメモリの問題で、それは直接制御で回避してるけど、
      それは制御するソフトウェア書いたって事だからそれはそれですごい。
      そのメモリもそうだけど、難しい点の一つが、リアルなハードウェアはリアルな時間の流れのなかで動作しているので、
      その時間制約をクリアする点で、今回はハードウェアが少ないから、まだましだったのかな。
      あとは、linux側もタイムアウトとかタイマ割り込みとかあると思うので、その辺の制約とか安定性確保とか、
      linuxのドライバ回りに精通していないとなかなか難しいのでは。それもすごい。

      というかデバッグ環境どうしてたんだろう。
      最初はエミュレータの上でエミュレータの開発してたんだろうけど、最終的にはそういう実機でないと出ないバグあるから、
      2時間動かして止まっててRAMリフレッシュ止まってコア吐く前に消えてとか、考えただけで嫌になる。

      趣味で好きだからこそできたんだろうな。

      親コメント
      • by AZUCO (32400) on 2012年04月03日 11時40分 (#2128632) ホームページ
        エミュレータにおける時間の扱いは、物によって難度が違うんですよね。

        デバイスのステートだけを見て書いてるプログラムの場合は、ステートさえちゃんと反映しておけば、特に問題無いです。
        ステート見ずに、他の手段でタイミングを計っている場合は、そのタイミングを計っているデバイスをちゃんと実装すればそんなに問題は無いです。
        そのタイミングを計るデバイスがそれぞれバラバラの場合は、それぞれの動作タイミングを合わせないと全然動かない場合が多いです(これが一番厄介)
        エミュレータが扱う時間も、仮想時間、実時間、がありますから、実→仮想時間へのマッピングや、仮想→実時間へのマッピングなんかが問題になる場合もあります。

        今回のコレは、想像で書いて申し訳ないのですが、恐らくデバイスの制御はステートを見てコントロールしてるんじゃないかと思います。

        個人的にはメモリ空間を表現するのが大変だっただろうなぁ・・・と。
        DOSのEMSみたいにいったんばらばらにして、仮想的に大域を表現したのかなと。
        親コメント
    • by T.SKG (20663) on 2012年04月03日 10時08分 (#2128554) 日記

      以前話題に上った
      「ラジコンのミニチュア重機で地下室を掘る」とか、
      http://idle.srad.jp/story/12/02/18/1921222/%E3%83%A9%E3%82%B8%E3%82%B3... [srad.jp]

      技術書でも欧米人の書いたものに「厚さ」と「濃さ」に、その精力とか根気の強さを感じるものがあったり
      以前の上司は、それを体格と肉食のなせる技だと言いながら、肉ばかり食べて腹回りばかり立派にしていましたが
      でも、こういう根気強さが育まれ許される(これも一種の)文化の違いかなあと思います。
      何でも文化のせいにはしたくないけど、根気を保てる「環境」が必要なのでしょう。

      親コメント
    • by Anonymous Coward

      まぁ世の中根気さえあれば何でも出来ますよね(棒
      #根気さえあれば著しい制限があるのか?とか疑問系で放置するバカなまねをしないでもすみますし

    • by Anonymous Coward

      警告していたのにやっぱりおっちょこちょいというか馬鹿が沸いてきたね

      イメージ的にマイクロプログラミングっぽいな

      • by Anonymous Coward

        警告(笑)さえしとけば何言っても許されるとか思ってる馬鹿が何言ってるの

      • by Anonymous Coward

        ここ最近、反論禁止の前置きをしつつ狭量な意見を投げる人が出没してますね。
        今の時期は学生さん暇なんでしょうけど、反論が嫌ならもう半年ROMってた方が…。

        • by Anonymous Coward

          ほっときゃいいのにいちいち噛みつく人も出没してますね。

      • by Anonymous Coward

        > エミュレーションホストのほうに著しい制限があるのか?
        あるんだよ。

        外バスのないプロセッサで無理矢理GPIO経由でメモリアクセスしてるという状態が「著しい制限」でないと思ってるとしたら、相当の大馬鹿だ。

        • by Anonymous Coward

          > 外バスのないプロセッサで無理矢理GPIO経由でメモリアクセスしてるという状態が

          GPIOでアドレッシングするだけなら普通のテクニック。8bit時代の漢字ROMとか大容量RAMボードとか。
          結果として、エミュレーションというよりマイクロプログラム的になったのは確かに面白い。

          わざわざDRAMをつけたりするところも趣味全開で面白いし、taka2氏の投稿によれば少ないメモリ(これは著しい制限だね)でよくやっていると思う。

          • by Anonymous Coward

            「GPIOでアドレッシングするだけ」ではないので的外れ。

            > 8bit時代の漢字ROMとか大容量RAMボードとか。
            GPIOだけでアクセスしている例はないですね。
            バンク切り替えの話をしているとしたら、全然違う。

            > エミュレーションというよりマイクロプログラム的
            何度もこの言い回しをしているようだが意味不明。

            • by Anonymous Coward

              > 何度もこの言い回しをしているようだが意味不明。

              あなたがマイクロプログラムについてご存知ないからでしょう。

              マイクロプログラムはCPU内部やメモリアクセスの信号をあらかた全部自分で作って出力するわけです。
              これと8bit時代の例をあげたテクニックと合わせてはじめて、私の「確かに面白い」という感想が理解できるようになります。
              「GPIOでアドレッシングするだけ」「GPIOでアドレッシングするだけ」というあなたの理解がいかに的外れかは明白です。
              大事なことなので何度もこの言い回しを繰り返しました。

              • by Anonymous Coward

                「マイクロプログラム」と書けばが何か説明した気になっているというあたりが頭悪いです。

                > マイクロプログラムはCPU内部やメモリアクセスの信号をあらかた全部自分で作って出力するわけです。
                という理解がすっとこどっこいです。

                > 8bit時代の漢字ROMとか大容量RAMボードとか
                のどこに「マイクロプログラム」が絡んでますか?

                GPIOでCSを設定してるだけ(バンク切り替え)なのと、GPIOだけでアドレス/データバス/CE/WRその他諸々全部制御してメモリリフレッシュまで行っているのが一緒と思える頭が気の毒です。

              • by Anonymous Coward

                > GPIOでCSを設定してるだけ(バンク切り替え)なのと、

                誰がバンク切り替えだと言いましたかね。
                バンク切り替えではコードを任意の場所に置けないので、8255などのポートにRAMを接続して制御するタイプのメモリボードが結構あったのです。
                自分の無知を他人に当てはめないでください。

                > GPIOだけで

                GPIOでCPU内部のラッチをエミュレートしているだけですね。

                > アドレス/データバス/CE/WRその他諸々全部制御して

                マイクロプログラムとはそういうものです。ご存知ないとはさすが無知の大王。

                > メモリリフレッシュまで

                前項とあわせてこのへんが今回の記事の面白みのあるところです。

  • by Anonymous Coward on 2012年04月03日 10時21分 (#2128564)

    LinuxマイコンボードRaspberry Pi、国内でも3,400円で発売へ
    http://hardware.srad.jp/story/12/03/14/1336254/ [srad.jp]
    カードサイズPC " Raspberry Pi "また延期、今度はCEマーク取得のため
    http://japanese.engadget.com/2012/03/29/pc-raspberry-pi-ce/ [engadget.com]

    調べたらまだ発売されていなかったから作ったんですね。

typodupeerror

「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常

読み込み中...