マイクロコントローラーのすべてのアドレスのサイズが8ビットしかないのはなぜですか?


18

32ビットのマイクロコントローラーでは、メモリの各アドレスには8ビットのデータしか保持されていません。16ビットMCでも同じです。32ビットデータの場合、4つのアドレスの組み合わせを使用します。32ビットデータを直接保持するようにアドレスを作成できないのはなぜですか(8ではなく32ビットまたは各16にする)?


2
マイクロコントローラーのデータバスに依存します。どの32ビットマイクロコントローラーにバイトメモリがありますか?例はありますか?
スワナンド

4
単に真実ではありません。これが、CやC ++などのプログラミング言語が1バイトが8ビットを超える可能性を組み込んでいる理由です。その大半は8ビットバイトで最適に動作しますが、9ビットまたは18ビットがあります。
PlasmaHH

6
それはキャンディーバーのようなものです。彼らは同じ価格でそれらを小さくし続けます。
オリンラスロップ

4
この質問を「なぜすべてのアドレスが8ビットに揃えられているのか」と言い換えることはできますか
フローリアンカステラーヌ

2
@FlorianCastellaneこれ。アドレスのサイズは8ビットではありません(メモリが256ビット未満のデバイスを見つけられない場合はそうです)。
ジェイジェイ

回答:


11

これは事実上設計上の選択であり、そうする必要があるという明確な理由はありません。昔、大量の汎用プロセッサが8ビット値で動作していたとき、マッピングはより一貫して1:1でした。設計が最新の32ビットおよび64ビットプロセッサに進化したときの一貫性のために、データバスが増加しても(実装コストのトレードオフが変化する)バイトアドレス指定の古いマッピングを維持することは理にかなっています。一部の32ビットMCUは、一部のメモリに16ビットデータバスのみを実装する場合があり、ハイエンドプロセッサは256ビット以上を備え、1つのメモリトランザクションで複数のコアレジスタをロードできます。ワイドインターフェイスは、バーストまたはストリーミング操作に適しています。

小さいアドレス可能なメモリサイズは、コードでバイト値を処理する場合だけでなく、特定のバイトの読み取りまたは変更が必要なイーサネットパケットのようなメモリ内の構造を操作するのに役立ちます。多くの場合、この種の操作は小さな操作を実行できる必要がありますが、非常に効率的です。

また、ビッグエンディアン、リトルエンディアン、または混合エンディアンのデータを操作する必要があるシナリオもあります。現在、多くの場合、これに専用のハードウェアサポートがありますが、メモリのバイトアドレス指定により、一部のシナリオでこのタイプの操作がより効率的になります。

レジスタ内のアドレスビット数がアドレス空間の制限要因となっているのはごく最近であるため、32ビットワードではなくアドレスバイトに2ビットを浪費することは10〜15年前にはあまり問題になりませんでした(そして現在では64ビットポインターがあり、48または56ビット幅のバイトアドレスを実装するのが一般的です)。入門的なコンピューターサイエンスの教育は、メインフレームのジャストポスト時代にはまだ少し立ち往生しており、進化の側面を常に明確に扱っているわけではありません。多くの用語が使用(および定義)されるようになったのは、(最も一般的な意味での)少量の高コストアーキテクチャが、リソースに制約があり、商品に焦点を合わせたプロセッサ設計によって補完され始めた頃です。

MCUについては特に回答していませんが、アーキテクチャの境界はあなたが想定しているほど明確ではありません。最新のグラウンドアップMCU設計でさえ、メニーコアサーバープロセッサと統合されるか、スケーラブルな製品セットの1つのポイントとしてのみ存在する可能性があります。どちらの方法でも、メモリにアクセスするための一貫したアプローチは、コードを記述または移植する必要があるエンドユーザーにとって有益です。

私は、上の質問をしretrocomputing SEレジスタは、この問題の歴史的な側面をフォローアップするためにサイズについて。


2
ワードサイズが長いプロセッサは、8ビットプロセッサよりも先だったと思います。8ビットプロセッサは、2つのマルチバイト数を追加する効率的な手段がなければ役に立たず、初期のプロセッサは単一のマシンワードより大きい数を効率的に処理できませんでした。
-supercat

1
私は8ビットプロセッサを使って、マルチバイトの数字を簡単に追加できることを知っていましたが、単一のCPU命令ではできませんでした。最初に、最下位の2バイトを追加し、最下位の結果バイトと個別のキャリービットを取得します。他の多くのバイトが存在する場合、次の入力バイトと前のステップのキャリービットを追加し、次の出力バイトと次のキャリービットを与えます。入力バイトが残っていない場合、最後のキャリービットをもう1つの出力バイトに変換します。
user6030

@ user6030:ADC命令を使用することは一般的ではありませんか?AVRは(8ビットRISCマイクロコントローラーであるため、gccはADCを使用する必要がintありますlong)、x86もARMも使用します。ほとんどの8ビットCPUは、より広範なregを備えたシステムよりもさらに多くの需要があるため、そうなると思います。ああ、supercatは初期のプロセッサには効率的なADCがなかったと言っているのですか?
ピーターコーデス

レジスタサイズの進化に関する有効なポイントだと思います(データはありませんが)
ショーンフーリハネ

25

16ビット未満の値をアドレス指定できないDSP(TI C54xなど)がいくつかあり、一部のオーディオDSPは24ビットを使用します。ただし、8ビット値はほとんどすべての汎用コードで使用されるため、すべての汎用CPUでサポートされています。

また、メモリアドレスに使用される小さい単位が8ビットバイトであるからといって、これが実際にバスで使用される最大単位であることを意味するわけではありません。ほとんどのCPUは、ネイティブのワードサイズ(16/32ビット)またはさらに大きいサイズを使用してメモリをアドレス指定し、バイトアクセスを使用する場合は、大きいワードから自動的にバイトを抽出します。

たとえば、PCIバスは常に32ビットトランザクションを使用しますが、アクセス用のバイトイネーブル信号は小さくする必要があります。


ありがとうございました。メモリ内のバイトではなくニブル幅のMCはありますか?
アルンジョーチェリヤン

4
たぶんIntel 4004?
pjc50

6
@ArunCheriyanニブルで最小のアドレス可能な単語として機能したCPUの例は、土星です。HPによって設計され、前世紀のハイエンド電卓(特にHP48)で使用されていたCPUです。非常に珍しいアーキテクチャ(64ビットレジスタ、4ビットALU、20ビットアドレスなど)がありました。
薄暗い

別の例:TIのTMS320C3xの最小アドレス可能ユニットは32ビットです。
kkrambo

1
@davidcaryああ、まあ...とにかく、日付と時刻は私の強力なスーツではありませんでした。妻に誕生日プレゼントについて尋ね、締め切りについては上司に尋ねてください
薄暗い

18

16ビットまたは32ビットのマイクロコントローラーは、多くの場合、8ビット幅(バイト)のデータを操作する必要があります。たとえば、テキスト文字列は通常、バイトごとに1文字で保存されます。マイクロコントローラは、個々のバイトをアドレス指定できるメモリアドレス指定スキームを持つことにより、8ビット幅のデータを効率的に処理できます。つまり、32ビットデータは通常4バイトの倍数のアドレス、たとえば04、08、0Cなどに存在します。ただし、メモリが32ビット幅の場合、マイクロコントローラーは1回の読み取りサイクルで32ビットを読み取ることができます。 。マイクロには異なる長さのデータを操作できる機械命令が含まれていることが多いため、データ移動命令(MOV)には、8、16、32ビットの1つの命令のデータ。


7

基本的な答えは「1バイトの長さだから」です。その仮定を行うコードの大規模な確立されたボディで、それを壊すことはあらゆる種類の問題を引き起こすでしょう。

初期の頃、確立されたコード本体はありませんでした。他の回答に示されているように、プロセッサはあらゆる種類の奇妙なアーキテクチャを頻繁に使用します。ただし、16ビットプロセッサが登場する頃には、8ビットデータの可用性を前提としたコードが十分にあり、それを実現しなければ、導入の本当の障壁になっていたでしょう。

アドレスごとに1つの32ビットワードを使用しても、メモリ速度が低下することはありません。32ビットシステムでは、下位2アドレスビットがメモリに移動しないことがよくあります。プロセッサは通常、32ビットワード全体を読み取り、そのワード内で必要な8ビットバイトを選択(またはマスクオフ)します。アドレス空間が十分なデータ(32ビットシステムで2 ^ 32バイトに制限されている)を保存できる限り、心配はありません。実際、多くの16ビット/ 32ビットプロセッサでは、ネイティブワード長の値よりもバイト値で処理する方が時間がかかります。 32ビットの単語を読むだけと比較してください。

逆に、メモリを効率的に使用する必要があるシステムがある場合は、個々のバイトにアクセスできる必要があります。できない場合は、メモリが不足します。それを念頭に置いて、個々のバイトを参照できることが明らかに必要であるため、メモリをバイト単位でチャンクすることは理にかなっています。


3
確かに。そして、プロセッサが、アライメントされていない 32ビット値をハードウェアで自動的にロードまたは保存するために必要な2つの異なるアクセスを処理できるか、またはソフトウェアで明示的に処理する必要があるかという追加の質問があります。
クリスストラットン

5

これは、バイトアドレス可能なメモリを持つものです。アドレス空間が不足している場合を除き、通常は良いことです(たとえば、すべてのアドレスが個別の32ビットワードである32ビットポインターの16 GBではなく、32ビットポインターの4 GB)。


アドレスをそれぞれ1つのレジスタに収まる部分に分割すると、アドレス空間がこのような制限を超える可能性があることに注意してください。アドレスを別々のレジスタに保持する2つの部分に分割することで64 KBのメモリに達する8ビットコンピューターがいくつかあり、アドレスを3つに分割することで1 MBのメモリに到達できる8ビットプロセッサを搭載したコンピューターの広告も表示しました部品。
user6030

AVR(8ビットRISCマイクロコントローラー)は、次のことを行います。32組の汎用8ビットレジスタの3つのペアは、16ビットポインターとして逆参照できます。また、別の8ビットセグメントと組み合わせて24ビットアドレスを取得する機能もあります。
ピーターコーデス

4

Analog Devices Shark 32ビットDSPには、アドレス可能なメモリの最小単位として32ビットがあるため、sizeof(int)== sizeof(short)== sizeof(char)== 1(はい、32ビットcharを持ち、完全に有効ですC標準)。

また、int_8やint_16などはで定義されていないため、他のプラットフォームからコードを移植するときの厄介な驚きです。


1

アドレス可能なメモリユニットのサイズは、基本的に、アドレス指定できるメモリ量と無駄にするメモリ量との妥協点です。

アドレス可能なメモリ。32ビットCPUを検討してください。バイトをアドレス指定すると、最大4GBのメモリをアドレス指定できます。個々のビットをアドレス指定すると、その量は512MBに削減され、32ビットのワードをアドレス指定すると、16GBになります。(あなたの質問は後者を示唆しているようです)。

無駄なメモリ。Xビットで表すことができる変数があり、それに対してNビットの単位しか割り当てることができない場合、X> Nと仮定すると、平均で(N-1)/ 2ビットを浪費します。 、メモリを100%の効率で使用します(少なくともアドレス指定の観点から)。バイトを使用すると、変数ごとに3.5ビットを無駄にし(効率56%)、32ビットワードを使用すると、15.5ビットを無駄にします(効率52%)。しかし、さらに悪化します。変数のほとんどが小さい(文字、ブール値、ステータスフラグを考える)場合、アドレス可能な単位が大きすぎると、ほとんどのメモリを浪費することになります。

たとえば、変数の平均サイズが8ビットであるとします。

  • ビットアドレス指定可能なコンピューターでは、100%の効率で割り当てることができ512*1024*1024*100%ます。これにより、5億4,000万の変数が得られます。
  • バイトアドレス指定可能なコンピューターでは、56%の効率で割り当てられ、4096*1024*1024*56%変数は24億個になります。これは、ビットアドレス指定可能なコンピューターと比較して、ほぼ5倍です!もちろん、8倍以上のメモリを購入する必要があります。
  • 32ビットアドレス指定可能なコンピューターでは、変数の少なくとも半分が8ビット未満しか占有しないため、変数は7%未満の効率で割り当てられます(32ビットのうち4.5ビットを使用)。いずれにせよ、43億個を超える変数を取得することはありません(特定のアドレスしか持っていないため)。実際にはそれよりも少なくなります。複雑な計算を避ければ、RAMの4倍の価格を支払いながら、バイトアドレス指定可能なコンピューターに比べておそらく20〜30%便利なストレージが得られると思います。

1

おそらくすでに他の回答でさまざまな方法を言っています。一般的に今日ではありますが、必ずしも歴史的にではありませんが、バイトは8ビットです。ほとんどの場合、「バイトアドレス可能メモリ」を処理します。つまり、1つのアドレスでアクセスできる最も小さいものはバイトです。しかし、それが私たちが対処できる唯一のものであることを意味するものではありません。プラットフォームに応じて、1つのアドレスを使用して、バイト、ハーフワード/ワード(16ビット)、ワード/ダブルワード(32ビット)など、64ビットにアクセスできます。命令は基本的に、通常、これらのユニット8、16、32、64で、目的のアクセスのサイズ(8、16、32、64など)を決定します。しかし、それは難しくはなく、「依存」します。

また、プロセッサやシステムの設計によっては、アクセスのサイズがメモリのサイズまたは最小アクセスのサイズであると仮定する理由はありません。ますます多くの要件があるため、最小サイズを使用してメモリシステムを実際に実装することは時間の経過とともに次第に意味をなさなくなります。 1バイトを読みたい場合、64ビットの読み取りを行い、残りのビットを投げます。なぜ余分な費用がかからず、バスをプロセッサコアの近くまで維持し、プロセッサが正しいバイトレーンを選択するのですか?バスを狭くしたり、バイトレーン内でバイトを移動したりするために、より多くのロジックやクロックが必要になります(時々行われます)。したがって、マイクロコントローラーの内部RAMは、たとえばシステムにとって意味がある場合、32ビット幅になる可能性があります。16になる可能性があります。書き込みのサイクル数を増やす場合は、その行のどこかで読み取り-変更-書き込みを行う必要があります。あなたのPCにシングルバイトを書き、どこかで64ビットの読み取りが発生し、その後、その64ビットの1バイトが変更されます以前とは異なり、キャッシュとコードにより、これは一般的なルールではありません。書き込みは発生しますが、メモリコントローラーはプロセッサからアドレスとデータを収集し、プロセッサが最終的に書き込み節約クロックを実行している間、プロセッサを実行し続けることができます。既にキャッシュ内にある)、

今日でもほとんどすべてに例外があります。一部のシステムにはビットアドレス指定可能な命令またはアクセスタイプがあり、アドレスがバイト以外の単位であるシステムもあります。バイトは常に8ビットであったわけではなく、それでも実際に実行されているシステムが存在する可能性があります(8進数を使用し、9ビットバイトの18または36ビットワードは、8進数を考える人間のプログラマーやチップ設計者にとって非常に理にかなっています。 8ビットは16進数の思想家にとって非常に理にかなっています)。

今、あなたがこれを読んでいるコンピューターは、そのドラムコントローラーのデータバスが32または64ビット幅であっても、実際のドラムモジュール自体はおそらく複数の8ビット幅の部分で構成されており、簡単に見ることができます。片側に8個または9個のチップがある場合は、おそらく64ビットまたは72ビット(64ビット+ 8ビットのECC)幅のバスで、8ビット幅の部品で実装されています。モジュールの片側に4個または5個のチップがあり、ピンの数がまだ多い場合は、32ビット幅(最近はほとんどありません)または4つのチップが16ビット幅で、5番目のチップがある場合は、 16ビット幅で、8のみが使用されるか、8ビット幅の部分です。32ビット幅のパーツもありますが、8ビット幅が最も一般的です。非常に一般的な方法で、過去に遡ります。

どのマイクロコントローラーを知る必要があります。32ビットに言及しているため、その部分のメモリは32ビット幅であり、それへのすべてのアクセスは32ビット幅であることがわかります(詳細な情報はありません)。おそらく8ビット、16ビット、32ビットのアクセスタイプを提供するプログラムが望むものを命令が決定する可能性があります。書き込みの小さいものはどこかで読み取り-変更-書き込みを必要とし、バイトレーンを無視します。フラッシュについても同じことが言えますが、フラッシュの書き込みは別のトピックです。ただし、内部フラッシュはおそらく32ビット幅であり、すべての読み取りは32ビット単位です。ただし、外部フラッシュは別の話です。おそらく1ビット幅(spiまたはi2c)ですが、spiパーツは1、2、または4ビットをサポートできる場合がありますが、1つの味oピンが最も一般的です。内部的にはバイト単位で編成されており、8ビット幅または16または32である可能性があります。または、バイト単位でシフトアウトしてアドレス指定することもできます。spiを使用すると、フラッシュパーツの設計に応じて、1つのトランザクションで1バイトとメモリ全体の間の任意の場所にシフトアウトできます。


0

1ビットプロセッサも入手できます!

データ幅はレジスタ(アキュムレータ)幅に従います。通常、これは「プロセッサ幅」ですが、アドレスバスは異なる場合があります(通常はより広い)が、用途によっては技術的に狭くなる場合があります。

8はもちろん2のべき乗数です。8ビットのユビキタスな使用と技術のコスト/能力に感謝する歴史があります。長い間8ビットが支配されていましたが、その理由の一部はバスの幅とレジスター(およびRAM)を8ビット幅よりも大きくすることの難しさです(レジスターがすべて8ビットの場合、16ビットデータのポイントはありません)。8ビットはかなり気の利いたもので、Hexでは非常に理にかなっています。8ビットは、アルファベット、数字、描画と制御文字(ASCII)、または0〜255または+ -127を保持できます。256バイトを超えるデータ(8ビットアドレスバス)へのアクセスはページングで簡単です。 256ページの256ページで64K(65536)になります。通常、ページ0は、ページを設定する必要がないため、アクセスが高速になるため、スクラッチパッドになります。私の最初のコンピューターには1k x 8ビットの静的RAMがありました!(ダイナミックRAMは安価でしたが、更新するにはより多くのハードウェアが必要でした)。いくつかのフラグ(c、nc、z、nz)、加算、減算、左右の回転により、8ビットマシンでかなり複雑な計算を行うことができます。浮動小数点演算ユニットは必要ありません!超高速ではありませんが、実行可能です!初期のプロセッサの多くはシングルステップであり、単純な静的RAMで使用できるため、デバッグが非常に簡単になりました。いくつかの8進バッファと初期の赤色LEDを追加すると、アドレスとデータバスの変化を見ることができます:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.