パララックスプロペラ

デュアルインラインパッケージのパララックスプロペラ
TQFPの視差プロペラ

Parallax P8X32A Propellerは、8つの32ビットRISC(縮小命令セットコンピュータ中央処理装置(CPU)コアを備えたマルチコアプロセッサ並列コンピュータアーキテクチャマイクロコントローラチップです。 [ 1 ] [ 2 ] 2006年に導入され、 Parallax, Inc.によって設計および販売されています。

Propellerマイクロコントローラ、Propellerアセンブリ言語、そしてSpinインタプリタは、Parallaxの共同創業者兼社長であるチップ・グレーシーによって設計されました。Spinプログラミング言語Propeller Tool統合開発環境(IDE)は、チップ・グレーシーとParallaxのソフトウェアエンジニアであるジェフ・マーティンによって設計されました。

2014年8月6日、Parallax Inc.は、Propeller 1 P8X32Aのすべてのハードウェアとツールを、 GNU General Public License (GPL) 3.0に基づくオープンソースのハードウェアおよびソフトウェアとしてリリースしました。これには、 Verilogコード、トップレベルハードウェア記述言語(HDL) ファイル、Spinインタープリタ、PropellerIDEおよびSimpleIDEプログラミングツールとコンパイラが含まれます。[ 3 ]

2020年にParallax Propeller 2(P2X8C4M64P)がリリースされました。

マルチコアアーキテクチャ

8つの32ビットコア(コグと呼ばれる)にはそれぞれ、 512個の32ビットロングワード(  2KB)の命令とデータにアクセスできる中央処理装置(CPU)があります。自己書き換えコードが可能で、例えばブートローダーがSpinインタープリタで自身を上書きするときに内部的に使用されます。Spinのサブルーチン(オブジェクトベースの高水準コード)は、コールスタックを必要とするコールリターンメカニズムを使用します。アセンブリ(PASM、低水準)コードはコールスタックを必要としません。共有メモリ(32KBのランダムアクセスメモリ(RAM)、32KBの読み取り専用メモリ(ROM))へのアクセスは、ハブと呼ばれる内部コンピュータバスコントローラによってラウンドロビンスケジューリングによって制御されます。各コグは、 PALNTSCVGAサーボ機構制御などのタイミング信号を生成するための2つの専用ハードウェアカウンタと特別なビデオジェネレータにもアクセスできます。 [ 4 ]

速度と電力管理

Propellerは、内部オンチップ発振器(部品点数は少ないものの、精度と安定性が若干犠牲になる)または外部水晶発振器またはセラミック共振器(最高速度は向上するが、総コストは高くなる)いずれかを使用してクロック制御できます。外部発振器のみ、オンチップ位相同期ループ(PLL)クロック逓倍器を介して動作させることができ、1倍、2倍、4倍、8倍、または16倍に設定可能です。

オンボード発振器の周波数(使用している場合)とPLL逓倍値は、どちらも実行時に変更できます。正しく使用すれば、電力効率を向上させることができます。例えば、タイミング調整のために長時間の無操作待機が必要になる前にPLL逓倍値を下げ、その後に逓倍値を上げることで、プロセッサの消費電力を削減できます。ただし、実効クロックレートはすべてのコグで共通であるため、この手法の有用性は、他のコグがタイミング依存のコードを実行していない(または変更に対応するように注意深く設計されている)状況に限定されます。

実効クロックレートは32kHzから80MHzまでの範囲です(ただし、動的制御に使用可能な正確な値は、前述の通り、使用する構成によって異なります)。80MHzで動作する場合、独自のインタープリタ型Spinプログラミング言語は、各コアで毎秒約80,000命令トークンを実行します。つまり、80,000の8倍、毎秒640,000の高レベル命令を実行します。ほとんどの機械語命令は実行に4クロックサイクルかかるため、コグあたり2,000万命令/秒(MIPS)、つまり8コグのPropellerでは合計160MIPSとなります。

消費電力を削減するには、クロックレートを必要最低限​​に下げる、不要なコグをオフにする(これにより電力消費が減少する)、不要なI/Oピン、あるいは安全に高インピーダンス状態(トライステート)にできるI/Oピンを入力として再構成するといった方法があります。ピンは動的に再構成できますが、この場合も変更はすべてのコグに適用されるため、特定の設計では同期が重要になります。あるコアがピンを出力として使用しようとしている一方で、別のコアがそれを入力として使用しようとしている状況に対しては、何らかの保護策が利用可能です。これはParallaxの技術リファレンスマニュアルで説明されています。

オンボード周辺機器

各コグは専用のカウンタタイマーハードウェア、および複合PALまたはNTSCディスプレイ (放送用の変調を含む) やビデオグラフィックアレイ(VGA) モニターなどのビデオ出力ステージの設計を簡素化するための特別なタイミング信号ジェネレータにアクセスできます。 Parallax では、プロペラ、水晶発振器、およびいくつかの抵抗器で構成される最小限の部品を使用して大まかなデジタル/アナログコンバータ(DAC) を形成し、ビデオ信号 (テキストとやや低解像度のグラフィック) を生成できるサンプルコードを提供しています。 ビデオタイミングハードウェアの補正能力はクロックレートに制限されるため、発振器の周波数は重要です。 複数のコグを並列に使用して単一のビデオ信号を生成することができます。 より一般的には、タイミングハードウェアを使用して、さまざまなパルス幅変調(PWM) タイミング信号を実装できます。

ROM拡張

Spinインタープリターとブートローダーに加えて、内蔵ROMは、特定のサウンド、ビデオ、または数学アプリケーション に役立つ可能性のあるデータを提供します

  • 一般的な文字生成アプリケーションに適したビットマップフォントが提供されます (ただしカスタマイズはできません)。
  • 対数表(底 2、2048 個のエントリ
  • 対数表(底2、2048エントリ)および
  • 正弦テーブル (16 ビット、2049 個のエントリが第 1 象限、角度 0 から π/2 までを表します。他の 3 つの象限は同じテーブルから作成されます)。

数学拡張は、浮動小数点演算ユニットの不足や、乗算や除算といったより基本的な演算の欠如を補うことを目的としています(これはSpinではマスクされていますが、アセンブリ言語ルーチンの制限です)。しかしながら、Propellerは32ビットプロセッサであるため、これらのテーブルは高精度な演算には不十分な場合があります。

Spinバイトコードインタープリタを内蔵

Spinは、Parallax社のチップ・グレーシーによって作成された、マルチタスクの高水準コンピュータプログラミング言語です。彼はまた、Spinが動作するPropellerマイクロコントローラをPropellerマイクロコントローラシリーズ用に設計しました。[ 5 ]

Spin コードは、Windows XP 用に書かれた GUI 指向のソフトウェア開発プラットフォームである Propeller Tool 上に書かれています。[ 6 ]このコンパイラは Spin コードをバイトコードに変換します。バイトコードは同じツールで Propeller チップのメイン 32 KB RAM にロードでき、オプションでI²Cブートの電気的に消去可能なプログラマブル読み取り専用メモリ( EEPROM ) にもロードできます。Propeller を起動すると、バイトコード インタープリタが内蔵 ROM からプライマリ COG の 2 KB RAM にコピーされます。次にこの COG はメイン 32 KB RAM 内のバイトコードの解釈を開始します。バイトコード インタープリタの複数のコピーを他の COG で実行できるため、複数の Spin コードスレッドを同時に実行できます。Spin コード プログラム内に、アセンブリ コード プログラムをインラインで挿入できます。これらのアセンブラ プログラムはそれぞれの COG で実行されます。

Pythonと同様に、Spin は中括弧キーワードではなく、インデント空白を使用してブロックを区切ります。

Propeller独自のマルチスレッドコンピュータ言語Spinのインタープリタは、バイトコードインタープリタです。このインタープリタは、目的に特化した統合開発環境(IDE)内で編集、コンパイルされ、Propellerにロードされたユーザーコードから、1バイトあたり1命令の命令列をデコードします。ParallaxがPropellerツールと呼ぶこのIDEは、Microsoft Windowsオペレーティングシステムで使用することを目的としています。

Spin言語は高水準プログラミング言語です。ソフトウェアで解釈されるため、純粋なPropellerアセンブリ言語よりも実行速度は遅くなりますが、メモリ効率は向上します。Propellerアセンブリのオペコードは32ビット長です。Spinディレクティブは8ビット長で、その後にディレクティブの動作を指定するための8ビットバイトが続く場合があります。

起動時に、バイトコードインタープリタのコピー(サイズは2KB未満)がコグの専用RAMにコピーされ、メインの32KB RAMでバイトコードの解釈を開始します。この時点から追加のコグを起動することができ、インタープリタの別のコピーが新しいコグの専用RAMにロードされます(つまり、合計8つのインタープリタスレッドが同時に実行できます)。これは、すべてのPropellerアプリケーションにおいて、少なくとも最小限の起動コードはSpinコードでなければならないことを意味します。

構文

Spinの構文は、以下のものを保持するブロックに分割できます。

  • VAR – グローバル変数
  • CON – プログラム定数
  • PUB – パブリックサブルーチンのコード
  • PRI – プライベートサブルーチンのコード
  • OBJ – オブジェクトのコード
  • DAT – 定義済みデータ、メモリ予約、アセンブリコード

キーワードの例

  • 再起動:マイクロコントローラを再起動します
  • waitcnt:システムカウンタが指定された値以上になるまで待機します
  • waitvid: (ビデオ) データを I/O ピンに出力する前に (ビデオ) タイミング イベントを待機します。
  • coginit:新しいタスクでプロセッサを起動する

サンプルプログラム

300万サイクルごとに現在のシステムカウンターを出力し、4000万サイクル後に別のコグによってシャットダウンされる サンプルプログラム( Propellerツールエディタに表示されるもの)

パッケージとI/O

チップの初期バージョン(P8X32A)は、40ピン0.6インチデュアルインラインパッケージ(DIP)、44ピンLQFP、またはクアッドフラットノーリードパッケージ(QFN)の表面実装技術パッケージに、32ビットポートを1つ備えています。40本のピンのうち、32本はI/O用、4本は電源​​とグランドピン用、2本は外部水晶振動子(使用する場合)用、1本は停電と電圧低下の検出用、1本はリセット用です

8つのコアすべてが32ビットポート(「A」と指定。現在「B」はありません)に同時にアクセスできます。あるコアがI/Oピンを出力として使用しようとし、別のコアがそれを入力として使用しようとした場合、特別な制御メカニズムによってI/O競合を回避できます。これらのピンはいずれも、前述のタイミングまたはパルス幅変調出力技術に使用できます。

パララックスは、プロペラの今後のバージョンでは、より多くのI/Oピンやより多くのメモリが搭載されることを期待していると述べています。[ 7 ]

仮想I/Oデバイス

ParallaxがNTSCビデオライブラリのデモ用に作成したグラフィックデモのスクリーンキャプチャ

Propellerの設計者は、「仮想I/Oデバイス」という概念に基づいて設計しました。例えば、HYDRAゲーム開発キット(レトロスタイルのビデオゲーム開発を学ぶための趣味家向けに設計されたコンピュータシステム)は、内蔵のキャラクタジェネレータとビデオサポートロジックを用いて、 VGAカラー画像、PAL/NTSC互換カラー画像、または放送用RFビデオ+オーディオをソフトウェアで出力できる仮想グラフィックス処理装置(GPU)ジェネレータを生成します。[ 8 ]

ここで表示されているスクリーンキャプチャは、ピクセルデータをシリアルリンクを介してPCに送信するソフトウェア仮想ディスプレイドライバを使用して作成されました。 [ 9 ]

ソフトウェアライブラリは、SPI、I²C、PS/2互換のシリアルマウスやキーボードインターフェース、ロボットシステム用のモータードライバー、MIDIインターフェース、LCDコントローラーなどのシンプルなUARTやシリアルI/Oインターフェースから、さまざまなI/Oデバイスを実装するために利用可能です。[ 10 ]

割り込みの代わりに専用コア

Propellerの設計理念は、ハードリアルタイムマルチコアアーキテクチャによって専用の割り込みハードウェアとアセンブリ言語でのサポートが不要になるというものです。従来のCPUアーキテクチャでは、外部割り込みラインはオンチップの割り込みコントローラに供給され、1つ以上の割り込みサービスルーチンによって処理されます。割り込みが発生すると、割り込みコントローラは通常のCPU処理を一時停止し、内部状態(通常はスタック上)を保存してから、指定された割り込みサービスルーチンに処理を移します。割り込み処理後、サービスルーチンは割り込みからの復帰命令を実行し、内部状態を復元してCPU処理を再開します。

Propeller で外部信号を迅速に処理するために、32 本の I/O ラインのいずれか 1 本を入力として設定します。次に、各コグで使用可能な 2 つのカウンタ回路のいずれかを使用して、その入力の遷移 (正エッジまたは負エッジ) を待機するようにコグが設定されます。信号を待機している間、コグは低電力モードで動作し、基本的にスリープ状態になります。この手法を拡張すると、Propeller は 8 本の独立した割り込みラインに、基本的に処理遅延なしで応答するように設定できます。あるいは、1 つのラインを使用して割り込みを信号で知らせ、その後、追加の入力ラインを読み取ってイベントの性質を判断することもできます。他のコアで実行されているコードは、割り込み処理コグの影響を受けません。従来のマルチタスク シングルプロセッサ割り込みアーキテクチャとは異なり、信号応答のタイミングは予測可能です[ 11 ]。実際、このコンテキストで「割り込み」という用語を使用すると混乱が生じる可能性があります。この機能は、ループ時間がゼロのポーリングと考える方が適切だからです。

ブートメカニズム

電源投入時、電圧低下検出時、ソフトウェアリセット時、または外部ハードウェアリセット時に、プロペラは内部ROMからマシンコードのブートルーチンを最初の(プライマリ)コグのRAMにロードして実行します。このコードはソフトウェアでI²Cインターフェースをエミュレートし、必要なシリアルクロックとデータ信号に2つのI/Oピンを一時的に使用して、外部I²C EEPROMからユーザーコードをロードます

同時に、他の2つのI/Oピンを使用してシリアルポートをエミュレートし、ソフトウェアをRAM(およびオプションで外部EEPROM)に直接アップロードできます。Propellerがシリアルポートからのコマンドを受信しない場合、ユーザープログラム(エントリコードは前述のようにSpinで記述する必要があります)をシリアルEEPROMからメインの32KB RAMにロードします。その後、Spinインタープリタを内蔵ROMから最初のコグの専用RAMにロードし、ブートローダの大部分を上書きします。

ユーザープログラムのロード方法に関わらず、実行はプライマリコグで実行されるSpinインタープリタによって初期ユーザーバイトコードを解釈することから始まります。この初期Spinコードの実行後、アプリケーションは未使用のコグを起動して新しいスレッドを開始したり、アセンブリ言語ルーチンを開始したりできます。

外部永続メモリ

Propellerは外部シリアルEEPROMから起動します。起動シーケンスが完了すると、このデバイスは外部周辺機器としてアクセスできるようになります。[ 12 ]

その他の言語実装

SpinとPropellerの低水準アセンブラ以外にも、多くの言語が移植されています

Cコンパイラ

Parallaxは、プログラミング言語CおよびC++用のGNUコンパイラコレクション(GCC)コンパイラをPropeller [ 13 ] (ブランチrelease_1_0)に移植したPropeller-GCCをサポートしています。CコンパイラとCライブラリはANSI Cに準拠しています。C++コンパイラはANSI-C99に準拠しています。外部メモリを使用することで、完全なC++がサポートされます。SimpleIDEプログラム[ 14 ]は、ユーザーにmakefileを必要とせずにプログラムを作成する簡単な方法を提供します。2013年、ParallaxはPropeller-GCCとSimple LibrariesをPropeller-C Learnシリーズのチュートリアルに組み込みました[ 15 ]。Propeller-GCCは積極的にメンテナンスされています。Propeller-GCCとSimpleIDEは、Parallaxが公式にサポートするソフトウェア製品です

Propeller Cコンパイラー用のImageCraft ICCV7はサポート終了となりました。[ 16 ]

Catalinaという名のフリーのANSI Cコンパイラが利用可能です。[ 17 ]これはLCCをベースにしており、積極的にメンテナンスされています。

BASICコンパイラ

PropBASICは、Parallax Propellerマイクロコントローラ用のBASICプログラミング言語です。 [ 18 ] PropBASICは、 Parallax Propellerを用いた開発のためのクロスプラットフォームツールセットであるBrad's Spin Tool(BST)を必要とします。2015年8月現在、BSTはi386-linux-gtk2、PowerPC-darwin(Mac OS X 10.4から10.6)、i386-darwin(Mac OS X 10.4から10.6)、i386-Win32(Windows 95からWindows 7)で動作します。

プロペラに乗って

Propeller では 、商用ソフトウェアとオープンソース ソフトウェアの両方を含め、少なくとも 6 つの異なるバージョンのForthが利用可能です。

PropForth

広範な開発とコミュニティのサポートを受けている無料版がPropForthです。[ 19 ]これはPropアーキテクチャに合わせて調整されており、Forthのコンセプトと一致して、アーキテクチャの独自性に関する一般的な標準から必然的に逸脱しています

PropForthは、Forthインタープリタ以外にも、チップの能力を活用する多くの機能を提供します。リンクI/Oとは、ストリームをプロセスに関連付ける手法のことで、アプリケーションに対して透過的に、あるプロセスが次のプロセスにオンザフライでリンクすることを可能にします。これにより、多くの場合、ハードウェアデバッグやJTAGインターフェースの必要性が軽減または排除されます。マルチチャネル同期シリアル(MCS)とは、プロップチップ間の同期シリアル通信のことです。96ビットのパケットが2つのコグ間で継続的に送信されるため、アプリケーションは追加のリソース(プロップチップ1つにつき+6コグ)を利用でき、適切に構築されたアプリケーションであればスループットへの影響はほとんど、あるいは全くありません。

LogicAnalyzer は、ソフトウェア ロジック アナライザーを実装する拡張パッケージを指します。EEPROMfilesystem と SDfilesystem は、EEPROM と SD フラッシュを使用して基本的なストレージを実装する拡張機能です。

PagedAssemblerとは、アセンブラルーチンをオンザフライでスワップイン(および上書きによるスワップアウト)できる最適化パッケージを指します。これにより、アプリケーションのサイズは事実上無制限になります。スクリプト実行により拡張機能をオンザフライでロードできるため、プログラムソースのサイズはストレージメディアのサイズまで拡張できます。

PropellerとJava

Propeller上でJava仮想マシン(JVM)を実行するための取り組みが進行中です。コンパイラ、デバッガ、エミュレータが開発されています。[ 20 ]

Pascalコンパイラとランタイム

Pascalの大部分のサブセットは、 PコードマシンP4システムに基づくコンパイラとインタプリタによって実装されている。[ 21 ]

グラフィカルプログラミング

PICoPLCラダーエディタのスクリーンキャプチャ

PICoプログラマブルロジックコントローラ(PLC、PICoPLC)は、Propellerプロセッサへの出力をサポートしています。プログラムはGUIラダーロジックエディタで作成され、生成されたコードはSpinソースとして出力されます。PICoPLCは、作成・シミュレーション・実行機能を備えたP8X32もサポートしています。発振周波数とIOピンはラダーエディタで自由に設定できるため、ターゲットハードウェアに制限はありません。PICoPLC開発者ウェブサイト([1])。

将来のバージョン

2014年現在、Parallaxは、現在のPropellerのコグがそれぞれ約20MIPSで動作するのに対し、それぞれ約200MIPSで動作するコグを搭載した新しいPropeller [ 22 ]を開発しています。パフォーマンスの向上は、最大クロック速度が80MHzから200MHzに向上し、命令をパイプライン化するアーキテクチャによって、クロックサイクルごとに平均1命令近く(約10倍)実行されることで実現されます。[ 7 ]

参考文献

  1. ^ Torrone, Phillip (2006年2月18日). 「ParallaxのPropellerチップ初見」 . Makeブログ. 2008年6月25日時点のオリジナルからのアーカイブ
  2. ^ Torrone, Phillip (2006年8月21日). 「Parallax Propeller(レビュー)」 . Make .
  3. ^ Gracey, Ken (2014). 「Propeller 1 Open Source」 . Parallax Inc. 2021年1月23日閲覧。Propeller 1 (P8X32A) は、すべてのハードウェアとツールを含む、100% オープンなマルチコアマイクロコントローラーになりました。Propeller 1 は、同クラスで最もオープンなチップと言えるでしょう。
  4. ^ Wong, William G. (2022年12月15日). 「EiED Online>> Parallax Propeller」 .
  5. ^ Scanlan, David A.; Hebel, Martin A. (2007年10月). 「8コアプロペラチップのプログラミング」 . Journal of Computing Sciences in Colleges . 23 (1): 162– 168.
  6. ^ 「Prop Tool」。WikispacesPropeller wiki 。2008年10月1日時点のオリジナルよりアーカイブ
  7. ^ a b「Parallax Forums message」 . Parallax Forums . 2010年9月24日時点のオリジナルよりアーカイブ。 2010年8月8日閲覧
  8. ^ 「プロペラビデオアプリケーションボードPCB」。SelmaWare Solutions 。2008年12月21日時点のオリジナルよりアーカイブプロペラ付きの専用ビデオジェネレータボード
  9. ^ 「Parallax Forumsのスクリーンキャプチャソフトウェアに関する投稿」。Parallax Forums 。2012年7月9日時点のオリジナルよりアーカイブ
  10. ^ GitHubp1 ; Propellerオブジェクト交換ソフトウェアライブラリ
  11. ^ 「割り込み」。WikispacesのPropeller wiki 。2010年9月21日時点のオリジナルよりアーカイブ
  12. ^キャントレル、トム(2006年8月)「コアナーを回す」サーキット・セラー誌第193号、80ページ。{{cite magazine}}:|archive-url=形式が正しくありません: タイムスタンプ (ヘルプ)CS1 メンテナンス: url-status (リンク)
  13. ^ 「Google Code 上の PropGCC」
  14. ^ 「Propeller C - SimpleIDEセットアップ」。learn.parallax.com
  15. ^ 「プロペラC」 . learn.parllax.com .
  16. ^ 「ICCV7 for Propeller (非商用) - 販売終了」 Parallax Inc. 2011年9月18日時点のオリジナルよりアーカイブ
  17. ^ 「Catalina - Propeller用の無料Cコンパイラ - 最後のフロンティア!」Parallaxフォーラム。 2012年7月31日時点のオリジナルよりアーカイブ
  18. ^ 「PropBASICはこちらからダウンロードしてください... 00.01.14 BSTの最新バージョン」 Parallaxフォーラム2009年12月23日
  19. ^ "propforth" . code.google.com .
  20. ^ 「Javaプログラミング」。WikispacesのPropeller wiki 。2008年10月4日時点のオリジナルよりアーカイブ
  21. ^ 「Pascalでのプログラミング」。WikispacesのPropeller wiki 。2008年10月4日時点のオリジナルよりアーカイブ
  22. ^ 「プロペラ2」 Parallax Inc. 2020年7月23日。