アカウント名:
パスワード:
知らない人のために書いておくと、ATmega1284のスペック。Atmelの8bitマイコンはアーキテクチャが共通で、レジスタ: 8bit×32本 +PC+SP命令長16bit固定の純RISC的なロードストアアーキテクチャで、1クロック1命令実行。
開発にはgccが使えます。アーキテクチャが素直なので、Cで書いてもそこそこ効率のよいコードになり、あまりアセンブラを使う必要がありません。
プログラムとデータを完全分離したハーバードアーキテクチャなので、データメモリ(SRAM)にある命令コードを実行したり、プログラムメモリ(フラッシュメモリ)にデータアクセスしたりはできません。だから、定数テーブルとかデータメモリには置けない(初期化手段がない)ので、大きなテーブルを扱いたいときはその取り扱いにちょっと苦労したりします。プログラムメモリにI/Oアクセスで読み書きすることはできるので、プログラムメモリの一部に定数テーブルを置いてI/Oアクセスで取得する感じ。
で、あとは、主にプログラムメモリの量とデータメモリの量、I/Oピンの数でラインナップが分かれています。ATmega1284 [akizukidenshi.com]のスペックは、
プログラムメモリ: 128KBデータメモリ: 16KBI/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。
8bitマイコンではcharの整数をよく使いますが、GCC(2年くらい前 3.4.3)はint未満な整数を使うとコードの品質が悪いように見えました。最近のは問題ないですか?
なんかCのルールを愚直に実装したようなintへの格上げを行いがちでしたね。同じようなコードでも、たまに最適化がかかってたりして、わけが分からなかった。
例えば、char aをa > 0と比較するとaを16bit整数に拡張してから比較するコードが出来てたりしました。たまに8bitのまま比較するコードが出来てたりするんですよね。
たしか、PCでも同じ感じだったから、アーキテクチャには依存しないと思う。
> 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例しか見つからなかった。問題が出やすいのは-O3とかの時だったか、もっと昔のGCCだったかな?記憶が結構怪しいようです。
で、avr-gcc 4.5.3でコンパイルしなおしたら、その1例も消えました。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
目玉の数さえ十分あれば、どんなバグも深刻ではない -- Eric Raymond
メモリバスを持たない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: (スコア:0)
8bitマイコンではcharの整数をよく使いますが、GCC(2年くらい前 3.4.3)はint未満な整数を使うとコードの品質が悪いように見えました。最近のは問題ないですか?
なんかCのルールを愚直に実装したようなintへの格上げを行いがちでしたね。同じようなコードでも、たまに最適化がかかってたりして、わけが分からなかった。
例えば、char aをa > 0と比較するとaを16bit整数に拡張してから比較するコードが出来てたりしました。たまに8bitのまま比較するコードが出来てたりするんですよね。
たしか、PCでも同じ感じだったから、アーキテクチャには依存しないと思う。
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ではそこまで細かいデータ型は気にしてなかったし、似たようなものなのかもしれませんが…
Re: (スコア:0)
わざわざ調べてくれてありがとう。
久しぶりにちょこっと見直して見たんだけど、それらしいのは1例しか見つからなかった。
問題が出やすいのは-O3とかの時だったか、もっと昔のGCCだったかな?
記憶が結構怪しいようです。
で、avr-gcc 4.5.3でコンパイルしなおしたら、その1例も消えました。