各マイクロコントローラーラインには独自のプログラミング言語/構文がありますか?


10

Arduinoをプログラミングして、Teensyのプログラミングを始めました。それらはCに似ていますが、プログラミング言語にはわずかなニュアンスがあります。

たとえば、ArduinoのCでは、関数pinMode(pin#、Output / Input)を呼び出して、デジタルピンを出力信号または受信信号のいずれかに指定します。TeensyのCでは、4つのポート(それぞれピンのコレクションを表す)の1つに関連付けられた「DDR」レジスタを設定します。これらのレジスタは、まとめて入力または出力のいずれかとして指定します(Teensy IO構文)。

初めてマイクロコントローラーを使用する場合、新しい「言語」を効果的に学ぶ必要があるかどうか知りたいのですが。「言語」という言葉は引用符で囲みます。構文のニュアンスはありますが、コンポーネントとソフトウェアでの設定方法は基本的に同等です。たとえば、ポートとピンの概念は、デジタルを出力/入力できる端子を指します。シグナル。

同じ論点で、ソフトウェアでプログラムされていないマイクロコントローラーはありますか、それともuControllerをプログラムするために常に使用されるソフトウェア層がありますか?後者の場合、誰がそれらのドキュメントを作成/提供しますか?


2
Arduinoプログラミング言語はC ++Cではない(またはCだけではない))またはC ++(またはProcessing)のサブセットにすぎません。完全に明確ではありませんが、確かにCを超えています。たとえば、クラスとユーザー定義可能な演算子+ =があります。
Peter Mortensen

1
これはC ++であり、g ++-avrを使用してコンパイルします。技術的には、独立したC ++実装であり、C ++標準ライブラリは含まれていません(動的メモリ割り当てや例外が必要なため)。クラスやテンプレートなどの言語機能を使用できます。レジスタに直接アクセスするのと同じパフォーマンスを実現するテンプレートベースのdigitalWrite()の置き換えを見てきました。Arduino メソッドにはかなりのオーバーヘッドがあります。
r_ahlskog 2015年

1
言語は同じです。異なるのはAPIです。マイクロコントローラーから離れてデスクトップアプリの作成を開始すると、Windows、Linux、Mac用のCプログラムを作成するときにまったく同じ問題が発生します。純粋にPOSIX API(3つのプラットフォームすべてでサポートされています)を使用している場合でも、ユーザーの設定/プリファレンスを保存する場合は、プラットフォーム固有の違いが発生します。
slebetman 2015年

回答:


3

マイクロプロセッサとマイクロコントローラは通常、異なる製品と製造ラインの間で共有アーキテクチャを使用します。これらのアーキテクチャは通常、すべての実装に共通の低レベルのコマンドセット(命令セット)を定義します。CまたはC ++コンパイラは、ARMプロセッサなどのすべての実行可能なバイトコードを生成できます。

ただし、アーキテクチャは全体像の半分にすぎません。特定のメモリアドレスが多数あるため、オンボードのペリフェラル、メモリ管理、およびアーキテクチャが対応していないその他の実装の詳細

製造元またはサードパーティは通常、定義、ポートマッピング、およびサンプルコードを提供するソースファイルのコレクション(HDK)を提供します。通常、HDKはCおよびC ++用です。通常、HDKにはデモボードが関連付けられています($ 500のarduinoと考えてください)。設計しているデバイスに合わせて開発/サンプルプラットフォームを調整するには、多くの詳細な設定作業が必要になることがよくあります

ArduinoはAVRアーキテクチャに基づいており、主にAtmelによってサポートされています。Arduinoは、プラットフォームブートローダーと、最小限の労力でプラットフォームを使用するための簡略化されたC ++関数とオブジェクトのライブラリを作成しました。ArduinoプラットフォームとIDEは、最小限の機器で愛好家向けに設計されています。arduinoの前は、PICは使いやすく安価なBASIC環境で同様の役割を果たしていました。

専門的な環境では、通常、このサポートはベンダー/メーカーによって提供されるか、サードパーティに委託されます。それらは低レベルのコードとヘッダーを提供し、そのHDKでアプリケーションを記述します。大規模な組織では、これは社内で行うことができます。メーカーは、プラットフォームの周りにオープンなAPI /ソフトウェアエコシステムを構築するという最近の傾向があります。プログラミングのサポートが非常に少ないチップはまだ無数にあり、ほとんどのプラットフォームの知識は企業の世界に閉じ込められています。


14

この場合の言語はまったく同じです。Arduino環境には、実際のハードウェアレジスタ(DDRx、PORTx、INxなど)へのアクセスを「ラップ」して、ユーザーフレンドリーな関数を追加したいくつかの追加ライブラリ(Cコードのみ)があります。これにより、オーバーヘッドが増加します(同じ操作で実行する必要のある命令が増えます)が、これらの呼び出しのみを使用するプログラムを記述し、それを別のチップ(たとえば、arduinoメガ)に再ターゲットするのは「簡単」なので、柔軟性が向上します。ライブラリは適切なマッピングを内部的に処理します。

異なるベンダーのチップ間で低レベルのアクセスを行うための「標準」APIは実際にはありません。ただし、すべての低レベルアクセスは同じ方法で行われます(固定メモリアドレスへの読み取りと書き込み)。そのため、全体的なアクセス方法は異なる部分間で同様になり、詳細と名前だけが異なります。おそらく、ポインタにキャストされた#definesレジスタアドレスの巨大なリストを含むヘッダーファイルを提供するだけです。または、ヘッダーファイルは構造を使用して、少しの階層で物事を整理します。一部の製造元は、より高レベルのAPIを提供している場合もあります。これは、複雑で設定が難しい周辺機器に非常に役立ちます。GPIOは非常にシンプルですが、DMAをサポートするUSB​​コントローラーのようなものは、何百ものレジスターを持つことができます。

つまり、最終的には「はい」です。新しいレジスタ名を学ぶ必要がありますが、言語はC ++(またはC、アセンブリ、またはおそらくもっと難解なもの)です。


4
ArduinoはC(実際にはC ++)だけではありません-Cコンパイラに渡す前にいくつかの変更を行うプリプロセッサを備えています。
Nick Johnson

実際、Arduinoにとっては、Cを超えています。C++(またはC ++のサブセット)です。
Peter Mortensen 2015年

Arduinoライブラリを備えたネイティブC ++だけですか、それともそれ以上ですか?
kayleeFrye_onDeck 2015年

Arduino IDEは、他の点では標準のC ++に加えて、少し前処理を行うようです。ほとんどのIDEはこれを行いません。
alex.forencich 2015年

基本的にはC ++ですが、main()あらかじめ定義されています。:代わりに、次の2つのエントリポイントを取得init()し、loop()(私が間違っているが、私は20フィートのポールとのArduinoをのみに触れてしまった場合、正しい私を)
slebetman

5

マイクロコントローラーとコンパイラーを混乱させています。特定のマイクロをプログラミングできる高水準言語は、そのマイクロで使用できるコンパイラーの機能です。

低レベルでは、マイクロはマシンインストラクションを実行します。これは、コンパイラがユーザーが「プログラム」であると見なすテキストファイル用に導出するマシンインストラクションです。実際に実行するロジックを指定すると、コンパイラーは、利用可能な機械語命令を使用してそのロジックを実装する方法を見つけます。この場合、プログラミングするのはコンパイラーの関数であり、マイクロのネイティブ命令セットではありません。

ネイティブ命令を直接指定することで、マイクロをプログラミングできます。これは、アセンブリ言語を使用して行われます。コンパイラと同様に、アセンブラは、作成したテキストファイルを受け取り、結果として機械語命令を生成するトランスレータです。違いは、この場合、それらの機械語命令を直接指定していることです。各命令には名前が付けられ、バイナリオペコードの代わりにこれらの名前を記述しますが、命令を直接指定しています。アセンブラは、テキストファイルに書き込んだ名前とオプションから、各命令の正確なバイナリエンコーディングを理解するという面倒な作業のみを行います。

高水準言語は非常に異なるマイクロ間で同じにすることができますが、機械命令は通常、関連するマイクロのファミリ内でのみ類似しています。たとえば、すべてのMicrochip PIC 18は、基本的なPIC 16とは異なり、PIC 24やdsPIC 30および33などの16ビットパーツとも異なる、同じ命令セットを(ほとんど)備えています。


1
アセンブラは、ジャンプステートメントのラベルも解決します。これは、手動で行うとエラーが発生しやすくなります。
ピートベッカー

2

プログラミング言語はCのままですが、ハードウェアにアクセスするためのメーカーのライブラリは異なります。私が知る限り、標準はないので、すべてのメーカーが独自のAPIを持っています。異なるメーカー間で移植可能にする場合は、独自の抽象APIを導入して、APIをメーカー固有のメソッドにマップする特定の実装でハードウェアにアクセスすることができます。


実際には、Cを超えています。C++(またはC ++のサブセット)です。
Peter Mortensen 2015年

2

他の回答では、高級言語(C ++など)とマシンコードが区別されていますが、各マイクロコントローラーに「言語」が関連付けられているという記述が無効になるとは思いません。

言語実装の違いは、異なる言語として分類できるほど大きくはありませんが、それらを「方言」に区別することをためらわないでしょう。ここには2層の変化が存在します。

  1. 高レベルのラッパーライブラリは、製造元または一部のサードパーティから入手できる場合があります
  2. 特定のコンパイラは、標準に準拠したコードを出力しない場合があります

Arduinoプラットフォームを観察しながら、これらのポイントを取ってみましょう。

  • Arduinoコミュニティは、AVRアーキテクチャチップ用に高度に抽象化されたC ++ライブラリを提供しています。これらのライブラリは、典型的なC ++プログラムから期待されるものとは異なる制御フローを提案します(例:main()の非表示)。
  • 内部的には、ArduinoはC / C ++コードを生成するavr-gccを使用してコードをコンパイルします。ただし、例外はAVRチップでは十分にサポートされておらず、ほとんどの場合無効になっています。このような大きな機能がないと、結果のプログラムは「通常の」C ++プログラムのように動作しない可能性があります。

これを知って、任意のマイクロコントローラーをどのようにプログラムするかをどのように決定しますか?いくつかのオプションがあります。

  1. 特定のチップ用のコミュニティ製ライブラリとIDEを検索します。AVRチップはCのみを使用して開発される場合がありますが、Arduinoプロジェクトは愛好家にユーザーフレンドリーなエクスペリエンスを提供します。
  2. 特定のチップ用にコンパイルできるコンパイラを見つけます。適切なコンパイラ、チップのデータシート、そしてある程度の忍耐力があれば、金属に非常に近いコードを書くことができます。

参考までに、GCCでサポートされているバックエンドのリストを以下に示します。ARM、AVR、MIPS、その他いくつかのサポートがあることに気づくでしょう。

「ソフトウェア」でプログラムされていないチップについて...

フィールドプログラマブルゲートアレイ(FPGA)を調べてみてください。FPGAは、ルックアップテーブルの値を変更してロジックゲートをエミュレートすることによって制御されます。これ自体には対応するソフトウェア形式はありませんが、VHDLやVerilogなどのハードウェア記述言語を使用して開発されています。


1

私は1つのプリント基板を見て、いくつかの表面実装デバイス、いくつかの抵抗、コンデンサ、LEDを見つけました。それは、これらのボードの1つがビデオカードであるため、抵抗とコンデンサ、および複数の層とトレースを備えたすべてのボードがすべてビデオカードであることを意味しますか?いいえ。

これは別の例です。このWebページは英語のアルファベットと英語の単語を使用しています。それで、ニューヨークタイムズのウェブサイトは、このウェブサイトをニューヨークタイムズにしていますか?いいえ、同じアルファベットと言語を共有しているだけですが、それ以外は完全に異なります。

Cは、その下にある命令セットを抽象化する汎用プログラミング言語です。ベアメタルに使用でき、他のオペレーティングシステムとは異なる互換性のないものを作成するために使用でき、ビデオゲームを作成するために使用できます。これらはすべて同じ基本C言語、いくつかの一般的なC関数と構造を使用します。ターゲットアプリケーションに固有の、関数の呼び出し。あなたが言及するこれらのプラットフォームのそれぞれまたは他のプラットフォームについて、誰かが作成することを選択した関数のセットがあるかもしれません。私と同じくらいこれまでの少数の人々が同じ答えをあなたに与えたように、それを違う方法で書いたのと同じです。プログラミングの自由を完全に制約することなく、100人のプログラマーを互いに分離して、特定の問題を解決するためのプログラミングタスクを提供します。そして、1から100までのさまざまな場所に到達し、他のソリューションと互換性がない可能性が高く、トレーニングや経験に応じて、1ではなくいくつかの共通のテーマがあり、次に、セットとして一意である可能性が高い変数名と関数名が個人ごとに異なります。あなたがすでに話しているのと同じボードを取ると、他の多くのプラットフォームと同様に、(arduino関数と)互換性がなく、他のプラットフォームと互換性のない自分のCコードが確かにあります。それがベアメタル組み込みプログラミングの美点であり、決して制約を受けることはありません。オペレーティングシステムの標準ライブラリ呼び出しやgui限定のルールセットなどを完全に自由に使用する必要はありません。おそらく1ではなく、トレーニングと経験に応じていくつかの共通のテーマがあり、次に、変数名と関数名がセットとして各個人に固有である可能性があります。あなたがすでに話しているのと同じボードを取ると、他の多くのプラットフォームと同様に、(arduino関数と)互換性がなく、他のプラットフォームと互換性のない自分のCコードが確かにあります。それがベアメタル組み込みプログラミングの美点であり、決して制約を受けることはありません。オペレーティングシステムの標準ライブラリ呼び出しやgui限定のルールセットなどを完全に自由に使用する必要はありません。おそらく1ではなく、トレーニングと経験に応じていくつかの共通のテーマがあり、次に、変数名と関数名がセットとして各個人に固有である可能性があります。あなたがすでに話しているのと同じボードを取ると、他の多くのプラットフォームと同様に、(arduino関数と)互換性がなく、他のプラットフォームと互換性のない自分のCコードが確かにあります。それがベアメタル組み込みプログラミングの美点であり、決して制約を受けることはありません。オペレーティングシステムの標準ライブラリ呼び出しやgui限定のルールセットなどを完全に自由に使用する必要はありません。あなたがすでに話しているのと同じボードを取ると、他の多くのプラットフォームと同様に、(arduino関数と)互換性がなく、他のプラットフォームと互換性のない自分のCコードが確かにあります。それがベアメタル組み込みプログラミングの美点であり、決して制約を受けることはありません。オペレーティングシステムの標準ライブラリ呼び出しやgui限定のルールセットなどを完全に自由に使用する必要はありません。あなたがすでに話しているのと同じボードを取ると、他の多くのプラットフォームと同様に、(arduino関数と)互換性がなく、他のプラットフォームと互換性のない自分のCコードが確かにあります。それがベアメタル組み込みプログラミングの美点であり、決して制約を受けることはありません。オペレーティングシステムの標準ライブラリ呼び出しやgui限定のルールセットなどを完全に自由に使用する必要はありません。

自分でビルドするのではなく、誰か他の人のサンドボックスでプレイすることを選択し、多くの人がそうするかもしれません。つまり、arduino guiとそのCライブラリを使用します。

同じpcを使用して、異なるバージョンのWindows it、linux、bsd、およびあるレベルでCを使用しているが、関数呼び出しが互いに互換性がない他のオペレーティングシステムのランドリーリストを実行できます。同じハードウェアと互換性のないCは、異なるハードウェア、同じ言語に拡張され、互換性のあるコードまたは互換性のないコードを持つ可能性があります。言語は決して互換性を持たせません。

Cがこれらの組み込みプラットフォームで使用されているのは、それが一般的な慣習であり、Cをこれに置き換えることができる他の言語がないためです。新しいプロセッサの最初のステップはもちろんアセンブリです。次にほとんどの場合がCです。次に、オペレーティングシステム(linux、bsdなど)を実行するのに十分強力な場合は、おそらくCです。Cは発明され、プラットフォーム間でコードを移植するという当時の問題を解決することを望んでおり、オペレーティングシステムがあり、C互換コンパイラがオペレーティングシステムで実行されるコードを作成する場合、標準のCファイルを実行します操作とprintfなど。しかし、ベアメタルは別の話です。オペレーティングシステムがなく、ファイルシステムやディスプレイの概念がないことがよくありますが、一般的な慣例では、そのルートでCを特定のアセンブリ言語に変換するCコンパイラが存在する可能性があります。


実際、Arduinoにとっては、Cを超えています。C++(またはC ++のサブセット)です。
Peter Mortensen

1

2番目の質問に答えると、「マイクロコントローラー」という用語は、チップにCPUとRAM(そしておそらくROM)が搭載されていることを意味します。すべてのマイクロコントローラーはソフトウェアを実行します-それが私たちが好きな理由です。

最初の質問をさらに詳しく説明しますが、(ほとんど?)すべてのMCUにはCコンパイラが搭載されていますが、基本的なC言語はすべてのプロセッサのすべての命令をサポートしているわけではありません。たとえば、Cには左/右シフト演算子がありますが、左/右回転演算子はありません。Cのポインターシステムは、個別のプログラムとデータアドレス空間をサポートしません(一部のハーバードアーキテクチャーのように)。Cは直接SIMDをサポートしていません。

コンパイラには、これらの機能を処理するためのいくつかのオプションがあります。

  1. 通常は新しいキーワードを使用して、ベース言語を拡張します(たとえば、ページングされたメモリの場合はニアとファー)。

  2. 組み込み関数を提供します(ローテーション用の__ror()および__rol()など)。

  3. C演算のシーケンスが1つの効率的な命令にコンパイルされるように、それらをオプティマイザに組み込みます(たとえば、乗算/累算)。

  4. それらを無視して、C標準以外の機能が必要な場合は、ユーザーにアセンブリコードを記述させます。

次のレベルは、主にすべてのレジスターを定義する、メーカー提供のヘッダーファイルです。これらを自分で作成することもできますが、そのMCUの専門家でない限り、それは大きな苦痛です。

最後に、製造元が提供するライブラリ関数があります。これは、レジスタ書き込みなどの低負荷のものを処理します。

あなたの例は2つのレベルを混ぜます。DDRは、レジスターを参照するマクロです。これは、ポインターアクセスまたはコンパイラ組み込み関数のいずれかとして実装されています(忘れてしまいます)。pinMode()は、DDRレジスタに書き込む関数です。

あるMCUラインから別のMCUラインに移行する場合、新しいレジスターと新しいコンパイラーの癖を学ぶ必要があります。同じ会社内にいる場合は、同様のAPIを取得できます。さまざまな企業がAPIを共有していません。なぜ競合他社への移行を支援するのですか?:-)


1

マイクロコントローラーは、多くの場合、ハードウェアレベルで異なるマイクロコードを持っています。マシンコード(つまり、数値の形式の命令-マイクロコントローラの生のマイクロコードを表す命令)またはシンボリックアセンブラ(各マシンコードの命令にニーモニックラベルを提供する)を入力する手間を省くために、移植可能な高水準言語が使用されます。

CとForthは、異なるマシンコードセット間で簡単に移植できるように意図的に設計されています。

したがって、ArduinoでCを使用し、TeensyでCを使用する場合、どちらの場合もCを使用しています。

ArduinoでForthを、TeensyでForthを使用した場合、両方のケースでForthを使用することになります。

場合によっては、追加のハードウェア機能により、言語を新しいハードウェアに移植する人(またはグループ)が、事前に作成したコードを記述して、ハードウェアプラットフォームの新しい機能にアクセスできるようになります。低レベルのコードを大量に記述する必要はありません。あなた自身。

これらのライブラリ(C)または辞書(Forth)には、ハードウェア固有の関数や単語を含めることができます。

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