3

PC-Lint (バージョン 9.0) で受け入れられない既存の C コード (サードパーティのソース、変更できません) があります。コードは組み込み環境で実行され、Green Hills Compiler が使用されます。

コード定義を受け入れるように PC-Lint を構成する方法に関するノウハウはありますか? 構造体の最初のメンバーのエラー メッセージのみを添付しました。

ヘッダーファイルからの定義は次のとおりです。

typedef struct  
{  
    uint32_t PINSEL0;  // see ERROR message from PCLint, line 153 in LPC23.h  
    uint32_t PINSEL1;  
    uint32_t PINSEL2;  
} LPC_PINCON_TypeDef;


#define LPC_PINCON_BASE           (0xE002C000)
#define LPC_PINCON                ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE)

#define PINSEL_BASE_ADDR    0xE002C000
#define PINSEL0        (*(volatile unsigned long *)(PINSEL_BASE_ADDR + 0x00))


/**************************/

/* function in c-file */

void Port_Init()  
{

  LPC_PINCON->PINSEL0 &= ~(3 << 4); //p0.2  

  LPC_PINCON->PINSEL0 |=  (1 << 4); // 

  LPC_PINCON->PINSEL0 &= ~(3 << 6); //p0.3  

  LPC_PINCON->PINSEL0 |=  (1 << 6); // 

  // etc................  
 }

/*******************************************/

  //    ERRORS from PC-Lint    
  //   **********ERROR MESSAGES**************

  #... (volatile unsigned long *)(PINSEL_BASE_ADDR + 0x00))
   uint32_t PINSEL0;
   LPC23.h  153  Error 10: Expecting identifier  

  #... BASE_ADDR + 0x00))  
   uint32_t PINSEL0;
   LPC23.h  153  Error 102: Illegal parameter specification  

  #... BASE_ADDR + 0x00))
   uint32_t PINSEL0;
   LPC23.h  153  Error 10: Expecting ';'
4

3 に答える 3

5

PC-lint FAQからの抜粋:

  1. lint にコンパイラ ヘッダーについて文句を言わないようにするにはどうすればよいですか?

    Lint は、「ライブラリ」ヘッダーのラベルを使用して、プログラマーが制御できないヘッダー (コンパイラー ヘッダーなど) を指定します。デフォルトでは、外部ディレクトリからの、または< >で囲まれたすべての #includes は「ライブラリ」と見なされます。これはオプションを使用して変更でき、オプションと+libclass オプションでさらに微調整でき ます。 その後、、およびオプションを使用して、ライブラリヘッダーから出力されるメッセージだけを制御できます。PC-lint とともに配布されるコンパイラ オプション ファイルには、通常、ライブラリ ヘッダーからの lint 出力をエラーのみに制限するオプションが含まれています (警告メッセージと情報メッセージを抑制します)。+/-libdir+/-libh
    -wlib-elib-elibsym-wlib(1)

それはあなたのニーズに合うはずです。そうでない場合は、警告を再現する最小限の例がいいでしょう。PINSEL0 の #define は、構造体の識別子として使用された後であるため、上記のものは私をなぞなぞにします。

于 2012-02-27T16:29:18.977 に答える
2

LPC_PINCON_TypeDefとマクロPINSEL0は、さまざまな状況からのものであると思います。定義がすぐに矛盾しているので、どちらか一方を変更できることを願っています。コード自体が正しくコンパイルされると仮定すると、両方の定義が1つの変換ユニット内で同時に使用されることはなく、PCLintはおそらく/おそらく誤った設定を使用します。

コンパイラの暗黙のマクロ定義をLintに提示していない可能性があると思います。少なくとも__ghs__マクロを定義する必要があります。オプションを使用して-d__ghs__ください。さらにオプションについては、マニュアルを確認してください。

オプションを使用して、正確なファイルとその包含順序を確認することをお勧めします-vf(または、完全を期すために、 -vaifLintが包含ファイルの検索に使用する検索場所を検査するために使用できます)。ただし、注意してください。出力は非常に大きく、ウィンドウやそのバッファさえも簡単にスクロールアウトします。出力をファイルにパイプして、後で検査するのがおそらく最善です。

そして、私は自分のWebサイトを指すことを躊躇しますが、必要に応じて、私のPDF PCLintを使用する方法」を参照してください。ゼロから、PCLintを使用してコードを適切にリントするための簡単な手順があります。設定するオプション。

すべてが役に立たない場合は、使用しているセットアップと、コンパイラーとPCLintの両方のオプションについて詳しく説明する必要があります。

于 2012-02-29T06:13:00.747 に答える
2

関数のコンパイル#define PINSEL0 ...時にマクロ定義がアクティブな場合、コンパイラエラーが発生Port_Init()しない理由がわかりません。コンパイル中にマクロを無効にする 何か (何か) が必要なようです-構造体を使用してレジスタにアクセスしている場合、それは必要ありません (そして有害です) 。#ifdefPINSEL0LPC_PINCON_TypeDef

lint ステップを実行するときに、同じ制御オプション/マクロ/その他が設定されていることを確認する必要があります。

実際のLPC23.hファイルを表示できますか (または Web 上のどこかを参照してください)。私が見つけた同様のファイル ( http://www.keil.com/dd/docs/arm/philips/lpc23xx.h ) は、「ダイレクト マクロ」手法のみを使用しており、LPC_PINCON_TypeDef構造体メンバー アクセス手法を提供していません。

于 2012-02-28T20:11:24.823 に答える