そのため、マイクロプロセッサにアセンブリをプログラミングするときに、本やチュートリアル、リファレンスをよく目にします。マイクロコントローラと呼ぶ人もいます。
例えば、Atmel ATtiny2313 ....私はいくつかのチュートリアルを見ました、いくつかはそれをマイクロプロセッサと呼び、いくつかはそれをマイクロコントローラと呼びますか?
どっち?そしてそれらを(基本的に)プログラミングすることは同じですか?(組立中)
そのため、マイクロプロセッサにアセンブリをプログラミングするときに、本やチュートリアル、リファレンスをよく目にします。マイクロコントローラと呼ぶ人もいます。
例えば、Atmel ATtiny2313 ....私はいくつかのチュートリアルを見ました、いくつかはそれをマイクロプロセッサと呼び、いくつかはそれをマイクロコントローラと呼びますか?
どっち?そしてそれらを(基本的に)プログラミングすることは同じですか?(組立中)
回答:
これは実際には1つの2つの質問です...
まず、マイクロコントローラとマイクロプロセッサの違いは何ですか?
マイクロプロセッサは、外部メモリバスから読み取られた一連の命令に従う純粋なCPUです。外部通信バスを介して、外部周辺機器(画面、キーボード、マウス、ハードドライブなど)を制御します。マイクロプロセッサをプログラムする場合、プログラムはデバイスの外部にあります。コンピュータでは、このメモリは最初に起動BIOS ROMであり、最初にオペレーティングシステムをハードドライブからRAMメモリに読み取り、そこから実行を続けます。
マイクロコントローラーは、オールインワンのCPU +メモリのようなもので、外界と通信するためのいくつかの外部ポートがあります。自己完結型であり、プログラムを保持するために外部メモリを使用しません(ただし、必要に応じて、作業データを外部メモリに読み書きできます)。
次に、マイクロコントローラとマイクロプロセッサのプログラミングは同じですか?
ある意味ではイエス、ある意味ではノー。
アセンブリ言語は、CPUが直接理解できる一連の命令を表す広義の用語です。アセンブリ言語を「コンパイル」すると、実際には何もコンパイルされません。コマンドを表す一連のバイトに変換し、いくつかの相対メモリ位置にプラグインするだけです。これは、マイクロプロセッサとマイクロコントローラの両方に共通です。
ただし、異なるタイプのCPUは、異なるセットのCPU命令を理解します。たとえば、pic 16F877マイクロコントローラーで動作するアセンブリ言語プログラムを作成する場合、16Fxxxファミリーのpicマイクロコントローラー以外のマイクロプロセッサーやその他のマイクロコントローラーにはまったく意味がありません。
したがって、アセンブリはすべてのマイクロプロセッサーとマイクロコントローラーで同様に機能しますが、実際に作成する命令のリストは大きく異なります。アセンブリ言語で書くには、デバイスのアーキテクチャに関する深い知識が必要です。これは、マイクロコントローラーの場合は通常、データシートから入手できます。
違いは、マイクロコントローラにはフラッシュEEPROMやRAMなどのオンチップメモリと、パラレルI / OやシリアルI / Oなどのペリフェラルが含まれていることです。最初のマイクロプロセッサでは、これらはすべて外部デバイスでした。I / Oのマイクロプロセッサの代わりに、アドレスとデータバスがピンに接続されていました。
どちらのコードを記述する方法も同じです。
その点を説明すると、非常に同じCPUがマイクロコントローラ(チップ上にすべてのコードおよびデータメモリを搭載)、マイクロプロセッサ(すべてのコードおよびデータメモリを外部)、またはハイブリッド(一部のCPU)として利用できるアーキテクチャ(ARMなど)があります。チップ上のメモリですが、ほとんどのアプリケーションでは外部メモリを追加します)。CPUは同じなので、プログラミング(CPU命令の意味で)は同じです。
これは灰色の領域になる傾向がありますが、マイクロコントローラーとマイクロプロセッサーのもう1つの一般的な違いは、マイクロコントローラーはほとんどの場合ハーバードアーキテクチャ(コードとデータに個別のアドレススペース)を使用するのに対し、マイクロプロセッサーはほとんどすべてVon Neumannアーキテクチャ(コードとデータに結合されたアドレススペース)を使用することです。
ハーバードアーキテクチャを使用するマイクロローラーファミリーの例には、AVR、Intel 8051、PIC(PIC32を除く、以下を参照)、およびARM Cortex-M3があります。顕著な例外は、パララックスプロペラと同様に、フォンノイマンアーキテクチャを使用するHCS08などのフリースケールプロセッサです。
これはプログラミングにいくつかの方法で影響します(以下の例ではCを使用しています)。
いくつかのタイプのRAMがあり、それぞれに独自のアドレス空間があります。たとえば、8051には外部データ(xdata)があり、両方が同じチップに実装されている場合でも、RAMの最初の256バイトとは別にアドレス指定されます。したがって、次のような変数宣言では修飾子を使用する必要がありますunsigned int xdata foo;
定数がコードメモリで宣言されている場合、アクセスする前に定数をRAMにコピーする必要があります。または、8051のコード修飾子やPICのプログラム空間可視性(PSV)機能など、データのようにコードメモリにアクセスする方法が必要です。
Cコードを1つのチップファミリから別のチップファミリに移植する場合、コードとRAMにアクセスするこれらの非標準的な方法は、(周辺機器以外の)主な違いになる傾向があります。
厳密なハーバードアーキテクチャでRAMからコードを実行することはできないため、自己書き換えコードはありません(プログラムメモリの再フラッシュをその場でカウントしない限り)。ただし、PIC32はコードをRAMで実行できるように変更されたハーバードアーキテクチャを備えています。パララックスプロペラは、ハードウェアスタックを持たないため、実際にはコードを変更してサブルーチンのリターンを実行する機能を利用しています。
マイクロコントローラは一般に、計算機能と周辺機能を提供するシングルチップソリューションです。
マイクロプロセッサは計算機能を提供しますが、周辺機能は提供しません。
周辺機能は、数ビットの単純なI / Oと同じくらい単純です。または、洗練されたカウンターとタイマー、ビデオディスプレイ、イーサネット、モーターコントロール、オーディオおよびビデオコーデックなどが含まれる場合があります。
特定のアーキテクチャ(x86ベースのCPUとMCUなど)では、「計算」コーディングは同じです。ただし、ペリフェラル機能へのアクセス方法はさまざまであるため、ペリフェラル機能がターゲットハードウェアにどのように実装されているかに応じて、ハードウェア固有のコーディングは非常に異なります。
マイクロプロセッサは通常、任意のまだ決定されていない目的のプログラムを実行するように構築されたコンピューターで使用されます。そのようなコンピューターには、一般に、ユーザー提供のコードが相互作用することが期待されるベンダー提供のコードがいくつか含まれています。対照的に、マイクロコントローラは通常、単一のプログラムを実行することのみを目的として構築されたマシンで使用されます。多くの場合、マイクロコントローラのコードを書く人は、マシンが実行するすべての命令を提供します。
一部のマイクロコントローラは、一般的なマイクロプロセッサと同じ命令セットを使用しています。パーソナルコンピュータの元のMacintosh、Amiga、およびAtari STシリーズで使用されていた68000命令セットは、一部のマイクロコントローラでも使用されています。Macintoshと68HC340ベースのコントロールボードで使用される命令セットは同じですが、2つのプラットフォームのプログラミングは大きく異なる傾向があります。Macintoshでは、ユーザー指定のプログラムが実行を開始するまでに、システムの大部分はすでに「セットアップ」されています。メモリのブロックを必要とするコードは、必要な量のレジスタをロードし、「A-trap」命令を実行できます。Macintosh OSは、以前に他の目的に割り当てられていないメモリへのポインタを返し、そのメモリ領域にマークを付けて、元の受信者が不要になったという指示があるまで、再度割り当てます。対照的に、68HC340と128KのRAMを搭載したボードでは、RAMを「要求」する必要や機能はありません。プログラムが開始すると、128Kが "取得"され、必要に応じて使用できます。他には何もそれを使用しませんが、裏側では、他の何もそれを追跡しないので、ユーザーのプログラムはそれがどの目的のためにどの領域を使用しているかを追跡する必要があります。
ここでの違いは、実際にはマイクロコンピュータとマイクロコントローラの間であり、問題はマイクロプロセッサについてですが、マイクロプロセッサプログラミングのほとんどの議論は、汎用コンピュータのコンテキストでそれを議論します。