10

HiTech PICC32 を使用して、PIC32MX のファームウェアを作成しています。私が回避したい問題の 1 つは、ほとんどのピンに複数の名前 (たとえば、AN0 = RB0​​ = CN2 = PGED1) があるため、AN0 が既に使用されていることに気付かずに、私または他の誰かが誤って RB0 を使用する可能性があることです。(これは、アナログ/デジタル ピンを誤って構成すると、過剰な電流が流れ、必須の煙が放出される可能性があるため、実際には壊滅的な事態になる可能性があります。)

使用されているすべてのピンを包括的に文書化するだけでなく、コーディングのレベルでこの問題を回避する簡単な方法があるかどうか疑問に思っていました. 人々 (主に私自身) が使用できるマクロが必要です。たとえばCLAIM_PIN(58)、2 回実行すると警告またはエラーが発生します。

(私はこれを絶対に望んでいません。唯一の可能な解決策が恐ろしすぎるか、維持できない場合、私はそれを忘れて、涙を流したり、自分自身に火をつけたりするという評判を築きます。この質問も見ましたマクロを生成するマクロについて、それを除外します。)

明確にする必要があります。コードは複数のコンパイル単位で記述されています (少なくとも、これがこのフレーズの意味だと思います)。A2D コード用の .h/.c ファイル、同様に SPI 用、および特定の I/O ポートのみを使用するさまざまなペリフェラル用のファイルがあります。スペースは実際には問題ではありません。私のコードでは PIC32MX に十分なスペースを残しています。また、別の __DEBUG フラグを使用して、最終的な使用のためにピン チェック コードを削除することもできます。

4

3 に答える 3

8
#define CLAIM_PIN(n) char claimed_pin_##n;

2 つのコードがピンを要求しようとすると、シンボルが二重に定義され、コンパイラまたはリンカーのいずれかがエラーを生成します。

編集:コメントに基づいて、これはより良い結果になるかもしれません:

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}
于 2009-10-26T03:37:09.823 に答える
6

わかりました、ここです。ランタイム コストはありません。

#define CLAIM(n) struct busy##n {}

CLAIM(58);
CLAIM(58);

2 回実行すると、エラーが発生します。

z.c:4: error: redefinition of ‘struct busy58’

チェックを複数のコンパイル単位に拡張するには、マクロをラップする必要#if DEBUGがあります。これは、リンカを使用して衝突を検出するため、実行時のフットプリントが発生するためです。

#define CLAIM(n) char busy##n = 1;
#define CLAIM(n) void busy##n() {} // bdonlan
于 2009-10-26T03:36:00.107 に答える
2

実行時のオーバーヘッドに余裕がある場合、またはこれがデバッグのためだけである場合はIOPinOpen()、マクロのトリックを処理する代わりに、使用中のピンを追跡する関数のようなものを作成します.

一方、Mark Ransom の更新された回答は +1 の価値がありました。

于 2009-10-26T07:06:23.683 に答える