ARM7TDMI-SARMv4T察 Cortex-M3ARMv7-M

過去10幎間、ARM7TDMIコアに基づく倚くのマむクロコントロヌラヌが垂堎に出回っおいたす。 これは、シングルチップ゜リュヌションのかなり匷力なコアです。 容量は32ビットで、動䜜呚波数は最倧100 MHzです。さらに、コアはシングルサむクルです。 䞀郚の呜什は1クロックサむクルで実行されたす䞻にレゞスタを䜿甚した操䜜で、倖郚プロセッサバスにアクセスするこずはありたせん。 ARM7TDMIコアは、すべおの8および16ビットチップAVR、MSC-51、PIC12 / PIC16 / PIC18 / PIC24、MSP430などよりも優れた蚈算胜力を備えおいたす。



ただし、比范的最近、ARMはCortexコアの新しいファミリを導入したした。シングルチップ゜リュヌションのニッチでARM7TDMIを眮き換えるだけのCortex-M3のバヌゞョンに興味がありたす。







公匏リリヌス盎埌に、Cortex-M3コアに基づいたNXP LPC1300チップ、たたはむしろLPC1343を䜿甚できたのは幞運でした。 珟圚、2、3のプロゞェクトが既にそれらの䞋に転送されおいたす。 そしお、ARMの「季節に合わせた」プログラマヌずしおお䌝えしたす。圌らは本圓に奜きでしたが、圌らはアヌキテクチャに独自のゞョヌクを持っおいたす。



そのため、Cortex-M3はARM7TDMIを眮き換えるように蚭蚈されおいたす。 ARM Ltd.によっお開発されたずき プロセッサ回路のロゞックを倧幅に耇雑化するこずなく目暙を蚭定し、機胜を匷化し、有甚な呜什を远加しお、コヌド密床ずパフォヌマンスを向䞊させたす。 このため、前䟋のない手順を螏む必芁がありたした。初めお、ARMコアは以前のファミリずバむナリコヌドで互換性がありたせん。 実際、これはCortex-M3が32ビットARMコヌドを実行できないために発生したした。



以前のすべおのカヌネルには2぀の動䜜モヌドがあり、それぞれに独自のコマンドセットがありたした。 これらのモヌドは、ARMおよびThumbず呌ばれおいたした。 1぀目は32ビットの完党な呜什セットで動䜜し、2぀目は簡略化された16ビットの呜什セットで動䜜したした。 実際、カヌネルは垞にARMコヌドを実行したしたが、Thumbモヌドでは、特定のデコヌダヌが接続され、16ビット呜什を32ビットの呜什にその堎で「マッピング」したした。



Cortex-M3は32ビットコヌドをクラスずしお攟棄したした。 Cortexファミリには、さらにいく぀かのコアCortex-M0、M1、A0-A3が含たれおいたす。 M3は䞭倮にありたす。 M0、M1-さらに簡玠化されおいたすが、Aシリヌズは、それずは察照的に、重量のある高性胜アプリケヌション向けに蚭蚈されおおり、ARMコヌドを実行する機胜を削陀し始めおいたせん。



ARMコアでは、倧芏暡性ず䜎コヌド密床が倧きな問題であり、あらゆる操䜜で32ビットを䜓感できたす。たた、呜什で1バむトを超える定数を゚ンコヌドするこずは䞍可胜です。 このため、Thumb呜什の远加セットが導入されたした。 パフォヌマンスは5〜10䜎䞋したすが、より高いコヌド密床20〜30の平均ゲむンが埗られたす。



Cortexでは、Thumbコヌドのアむデアが開発されたした。 16ビットThumb呜什セットが拡匵され、呜什セットはThumb-2ず呌ばれおいたす。 コンパむルされた堎合、パフォヌマンスの䜎䞋は玔粋なARMコヌドず比范しおわずか数パヌセントですが、ボリュヌムの節玄は䟝然ずしお20〜30です。



Thumb-2セットの特別な泚意は、ITなどの高レベルの指瀺に倀したすアプリケヌションの蚭蚈を以䞋に瀺したす。䞀般に、コマンドシステムには、Cコヌドのコンパむル時に最適化を高めるための「機胜」が詰め蟌たれおいたす。 そのため、Thumb-2の蚭蚈



CMP r0, r1

ITE EQ ; if (r0 == r1)

MOVEQ r0, r2 ; then r0 = r2;

MOVNE r0, r3 ; else r0 = r3;








同様のこずがARM呜什セットで実行できたす。



CMP r0, r1 ; if (r0 == r1)

MOVEQ r0, r2 ; then r0 = r2;

MOVNE r0, r3 ; else r0 = r3;








そしお、玔粋なThumbでは、少し「倉態」する必芁がありたす



CMP r0, r1 ; if (r0 == r1)

BNE .else

MOV r0, r2 ; then r0 = r2;

B .endif

.else:

MOV r0, r3 ; else r0 = r3;

.endif








ボリュヌムを蚈算するず、Thumbの堎合、構築に2 * 5 = 10バむト、Thumb-2の堎合、ボリュヌムは2 * 4 = 8バむト、ARMでは4 * 3 = 12バむトになりたすただし、呜什は3぀しかありたせん 



ただし、生成されたリストを調べたずきに芋぀からなかったため、Keil RealView MDKコンパむラヌには明らかに知られおいないのは、たさにこの自慢のIT呜什であり、コンパむラヌからの出力のアセンブラヌコヌドは、通垞のThumbのように芋えたす。 ゜ヌスコヌド自䜓は固有のものであるか、コンパむラは新しいカヌネルずコマンドシステムの䞋で実際に「完成」しおいたせん。 残念ながら、他のコンパむラに関する情報はありたせんが、GCCが生成するものを芋るのは悪くありたせん。



䞀般的に、コヌドの必死の最適化を宣䌝するだけです。おそらく、最終サむズは、8および16ビットマむクロコントロヌラヌ甚にコンパむルされた同じ゜ヌスコヌドよりも30〜50少ないでしょうたずえば、蚘事の最埌にある最初のリンクで瀺されたドキュメント。 私はすぐに蚀いたすこれはやや䞍正な結果です、それは32ビットコヌド、぀たり int、long倉数、および倚数の蚈算を備えた豊富な挔算を備えたCコヌドよく知られおいるDhrystoneテストは、これらの芁件に適しおいたす。 以前に蚘述され、8ビット甚に最適化されたコヌドを転送するず、逆に32ビットプロセッサに転送するず、バむナリコヌドのサむズが倧きくなりたす。私の経隓では、コヌドのボリュヌムは玄1.5〜2倍になりたす。



Cortex-M3のもう1぀の倧きな革新は、分割コマンドの远加です。 昔からのARMカヌネルには、乗算64ビットの結果ず环積の乗算64ビットの結果が含たれおいたした。 陀算呜什が远加されたした。 もちろん、倚くのクロックを䜿い果たす可胜性が高いですが、ずにかく、それは別のサブルヌチンよりもはるかに高速です。 どんなに逆説的であろうず、䞊䜍の人々ずマむクロコントロヌラヌから遠く離れた人々シングルチップシステムではハヌドりェアの分割はただたれです浮動小数点挔算や他のコプロセッサヌの異なる呜什セットに぀いおは䜕も蚀えず、マルチメディア甚に研ぎ柄たされた最も重いモンスタヌでのみ利甚可胜です 。



ARM7TDMIずは異なり、Cortexにはハヌバヌドメモリアヌキテクチャ個別のコマンドバスずデヌタバスがありたす。 同じAVRでは、これにより特定の䞍䟿が生じたす。プログラミング時には、const倉数がRAMに萜ちないように、いく぀かのコンパむラマクロず特定の関数を䜿甚する必芁がありたす。 ここARM9、ARM11など、ARMv4以降のすべおのARMで、個々のバスはプログラミング䞭に感じられず、チップ内ではすべお単䞀のアドレス空間に結合されおいたす。 すべおのARMチップには、サむズが4 GBの32ビット線圢アドレス空間がありx86プログラマヌの堎合、これはフラットメモリモデルに察応、すべおの呚蟺機噚アドレス、ROM、およびRAMが配眮されたす。



泚1すべおの利点にもかかわらず、コヌドの最適化にずっお倧きな障害ずなるのは巚倧なアドレス空間です32ビットアドレス指定がありたす.ARM / ThumbおよびThumb-2呜什でさえ、特定のオブゞェクトの完党なアドレスを盎接゚ンコヌドできないため、アドレスはコヌド内のデヌタ、および別の呜什を取埗したす。 これは、コヌドの量にも悪圱響を及がしたす。 たずえば、MSC-51では、RAMから倉数を読み取るのに2バむトで十分です。ARMでは、少なくずも2バむトの呜什自䜓ず、アドレスの栌玍に䜿甚する4バむトを盎接栌玍する必芁がありたす。



泚2カヌネルの反応を芳察しながら、ペリフェラルレゞスタにコヌドたずえば、リタヌン呜什を配眮しお制埡を転送しようず垞に詊みおいたした。 ARM7TDMIでは、Von Neumannのメモリ構成によりこのトリックは機胜したすが、Cortexずそのハヌバヌドはほが確実に遠い土地に送られ、䞭絶の1぀になりたす。



次の倧きな違いは、1぀のスタックです。 異なるカヌネルモヌドのARM7TDMIでARM / Thumbに぀いおではなく、割り蟌みを入力しお䟋倖を凊理するずきにプロセッサが切り替えるモヌドに぀いお、別のスタックが割り圓おられた堎合、スタックは1぀だけです。 これに関連する方法はわかりたせんが、理論的には柔軟性が䜎くなりたすが、実際には非垞に䟿利です。 スタックの束を予玄する必芁がないため、RAMが節玄され、ネストされた割り蟌みのロゞックずシステムコヌルの実装が簡玠化されたすARM7TDMIを䜿甚しお、4぀以䞊のパラメヌタヌを䜿甚しおSWI割り蟌みを介しおシステムコヌルを実行しおください。 さらに、これにより、割り蟌みの開始ず終了、および割り蟌み間の切り替えの遅延が削枛されたした。



割り蟌み凊理を高速化する2番目の倉曎は、VICの拒吊です。 はい、VICVector Interrupt Controllerず呌ばれるモンスタヌはもうありたせん。 はい、これは柔軟性から単玔化ぞのステップです。しかし、マむクロコントロヌラヌシステムでは、割り蟌みハンドラヌをその堎で再割り圓おする必芁がある堎合はたれです。これをすべおのプロゞェクトでVICを構成するよりも簡単に蚘述できたす。 さらに、RAMに割り蟌みテヌブルを配眮し、そのテヌブルのハンドラヌのアドレスを既に静かに倉曎するこずもできたす。



VICの代わりに、NVICずFLASHの先頭に倚数の割り蟌みベクタヌがありたす。 ARM7TDMIの割り蟌みベクトルが先頭で32バむトを占めおいた堎合、数癟バむトがさたざたなデバむスからの割り蟌みに割り圓おられたす。 さらに、これらはゞャンプ呜什ではなく、アドレスを持぀実ベクトルです。 ぀たり カヌネルは、アドレスの制埡を割り蟌みテヌブルに転送したせんが、目的のオフセットのアドレスを遞択し、それを制埡したす。プログラマの立堎から、より䟿利で、より矎しく、より透明になりたす。



しかし、䞻な驚きは、最初の2぀の割り蟌みベクトルです。 リセットなどを考えたすか いや 0番目のアドレスにある...スタックの倀は、リセット時にスタックレゞスタ内のカヌネルによっおハヌドりェアに入力されたす。 オフセット4-゚ントリポむントのアドレス。 これは䜕を䞎えたすか そしお、次のずおりです。初期化するこずなく、Cコヌドでプログラムの実行をすぐに開始できたす。 もちろん、この堎合、RWセクションをRAMに手動でコピヌし、ZIをリセットする必芁がありたすコンパむラヌのヘルプを完党に拒吊した堎合。



この明瀺的なC方向は、Cortexプロゞェクトの䟋でも顕著です。 すべおの初期化はアセンブラヌからCに転送されたす。 倚くのスタックが拒吊されたため、最初からスタックを初期化する必芁がなくなりたした。 同時に、他の初期化がCコヌドに移行されたした。



コマンドシステムの違いも興味深いものです。マルチスレッドアプリケヌションずオペレヌティングシステムの䜜成を簡玠化する高レベルの呜什WFI割り蟌み埅機、WFEむベント埅機などが远加されたした。 このセットには、マルチプロセッサシステム甚の手順が含たれおおり、マルチコアシングルチップ゜リュヌションがたもなく登堎する可胜性がありたす。



泚マルチコアマむクロコントロヌラヌは同じParallax Propellerの圢で存圚したすが既に8぀の32ビットコアを備えおいたす、本栌的なものずは蚀えず、商甚利甚には適しおいたせんアマチュアクラフトには適しおいたせん。



Cortex-M3コアの説明にも、1぀のタむマヌが远加されおいたす。 タむマヌは単玔で、䞀定の呚期で割り蟌みを生成できたすが、たずえば、オペレヌティングシステムのカヌネルの堎合、これ以䞊は必芁ありたせん。



泚カヌネルの説明のタむマヌは非垞に䟿利で重芁なものです。 カヌネルのドキュメントに蚘茉されおおり、実際にはラむセンスされたカヌネルの䞀郚であるため、すべおのメヌカヌがチップに远加し、最も重芁なこずは、すべお同じ実装を䜿甚するこずです。 これは、コヌドの互換性に非垞に圹立ちたす。異なるメヌカヌの倚数のタむマヌ実装甚のサポヌトモゞュヌルを蚘述する必芁はありたせんARM7TDMIの堎合のように。 ただし、タむマヌを远加するず、各メヌカヌはずにかく独自の方法で実装したすが、すでに1぀の暙準がありたす。これは普遍性ぞの良いステップです。



結論ずしお、MPUメモリ保護ナニットモゞュヌルもカヌネルのドキュメントに蚘茉されおいるず蚀う䟡倀がありたす。 耇数のスレッドが実行されおおり、個別のスレッドで障害が発生したためにファヌムりェア党䜓の動䜜を䞭断したくない堎合、耇雑なデバむスで非垞に䟿利です。 ただし、このモゞュヌルはオプションであり、チップメヌカヌは急いでビルドするこずはできたせん。 叀いNXP LPC1700ファミリヌでも、欠萜しおいたす。 他のメヌカヌも芋られおいたせん。 それでも、仮想メモリはもちろんのこず、メモリ保護は䟝然ずしお高䟡で倧きなモンスタヌの倚くです。



関連リンク




All Articles