PIC 16F初心者..異なるコンパイラーを使用する場合のプログラム構文の違い


9

すでに述べたように、私はpic16f877aのプログラミングを始めたところです。これで7セグメントディスプレイを操作できます。現在、ccsコンパイラを使用しています。何も問題ありません。しかし、私はコンパイラに依存しないプログラマであることが好きです。したがって、IARやHitechcなどの他のコンパイラで同時に作業したいと思っています。ccs以外の「コンパイラーでのプログラムステートメント宣言」が異なるかどうか知りたいのですが?このことへの取り組み方を教えてください。あらゆる形の提案を歓迎します。前もって感謝します。

回答:


9

コンパイラに依存しないようにしたいのはすばらしいことです。残念ながら、ローエンドPICのハイテックコンパイラとCCSコンパイラは、コンパイラ固有のプリプロセッサ宣言、コンパイラ固有のピンアクセスルーチンを多数使用し、CCSコンパイラの場合は、SPI、I2C、ADCなどのコア関数にアクセスします。

多くのプリプロセッサ#define、#ifdef、#ifndefなどがなければ、コードをコンパイラ固有ではないコードに記述して、各コンパイラが提供する特定の部分にアクセスすることはできません。これにより、コードが読めなくなります。

あなたが目指すことができる最高のものは、IDEに依存せず、Eclipseのようなものを使用することです。そのため、少なくとも同じIDEを使用しています。これにより、コア機能を設定するためのCCSウィザードが失われますが、同じIDEを使用する際の柔軟性が向上します。

考慮すべきもう1つのことは、hitechとCCSのどちらにも(少なくとも過去には)真のcコンパイラリンカーがないため、私が個人的に軽視している "#include myfile.c"を使用する必要があったことですが、それは別の話です。

CCSとhitechのみを使用したため、IARコンパイラについてはコメントしていません。どちらも問題なく動作しましたが、モトローラ(現在はフリースケール)プラットフォームから別のプラットフォームに移行し、当時より高度なメトロワークスコンパイラーを使用した後も、満足できませんでした。IARコンパイラは良さそうですが、使用したことがありません。


pic18以上に対応できる場合は、c18コンパイラを確認する必要があります。たくさんのサポートがあります。IARはPICサポートを終了し、メンテナンス付きのライセンスを販売しなくなります。
Kortuk、2011年

PIC16 / 12/10アーキテクチャはC言語にうまく対応していないことが私の理解です。したがって、Cコンパイラは、PICアーキテクチャを補うために、いくつかの変わった非標準の構造を持つ必要があります。その結果、どのコンパイラーも相互運用できなくなります。
コナーウルフ2011

7

PIC18パーツを使用している場合は、MicrochipのC18コンパイラをお勧めします。これは、CCSコンパイラよりもANSI Cにはるかに厳密に準拠しています。Hi-Techコンパイラーは使用していないので、よくわかりません。前に述べたように、コンパイラに依存しないコードを本当に作成する必要がある場合は、多数のプリコンパイラディレクティブを使用する必要があります。複数のコンパイラをサポートするマイクロチップのサンプルプログラムをいくつか見て、どのように行われるかを理解することをお勧めします。


pic18にはc18、pic24にはc30、pic32にはdspic、c32!
Kortuk、2011年

CCSその特定の物事にはいいですが行うのは簡単である(例えば、割り込みとタイマーを-すべてのマイクロチップの例では、C18での作業右に割り込みを取得するためにASMを書く必要があり)、それは近いANSI Cにある
J. Polfer

必要なアセンブリ命令は1つだけです。これは、割り込みサービスルーチンを指すように割り込みベクトルを設定するために使用されるGOTOです。
mjh2007 2010年

3

残念ながら、マイクロコントローラー用のコンパイラーに依存しないプログラムを見つけるのは非常に困難です。いくつかの問題がありますが、ここでは2つだけです。

  1. ペリフェラル、SFRネーミングなどの違い(特に他のプロセッサとの違いはあるが、同じファミリーのコンパイラであっても)、そして;

  2. アセンブリコードを呼び出すためのビットの個別設定や異なる構造のような一部のコンパイラの非標準機能。

16Fシリーズは、アーキテクチャの点で非常に制限されており、Cコンパイラをサポートするようには設計されていません。そのため、GCCがありません。


3

見てくださいSDCCを。PIC16およびPIC18デバイスの多くをサポートしています。GCCはPIC24とdsPICをサポートしています。


さまざまなコンパイラを使用している間のステートメントの違いについて質問しました..とにかく、もう1つのコンパイラ 'sdcc'について知ったようになりました..おかげで..
VV Rao

2

コンパイラに依存する可能性が最も高いのは、次のとおりです。

  • シングルビットの使用(特にIOポートで)
  • 整数のサイズ、および符号付きまたは符号なしのchar
  • 面白いポインタ:C18はromとramポインタを区別します:(
  • 構成ヒューズ
  • 忙しい待っています

これを処理するための私の好ましい方法は、これらの側面のマクロを記述し、コンパイラーにコンパイラー固有の事前定義マクロに基づいて正しいマクロを選択させることです。この方法でRFM70ライブラリとサンプルアプリケーションを作成し、PIC14(HiTechC)、PIC16(C18)、およびARM(GCC)で実行しました。

(更新)RFM70ライブラリが完成しました。PIC 16F(Hitechコンパイラ)上のC、LPC11114(Cortex)およびLPC2148(ARM7TDMI)(GCCコンパイラ)およびArduino(ATMega128、GCCコンパイラ)上のCおよびC ++をサポートします。これは、Pythonスクリプトでいくつかの前処理を行うことにより、同じソースから(doxygenのドキュメントを含めて)生成されます。Jalサポートは開発中です。おそらくProtonBasicが続くでしょう。http://www.voti.nl/rfm70

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