2017-04-10 14 views
2

誰かがこれを助けることができますか?PIC18変数の宣言と初期化がハードウェアで失敗する

要約:変数の宣言と初期化はPICハードウェアでは機能しませんが、シミュレーションではうまく機能します。また、変数が構造体の場合、この問題は悪化しているようです。私は使用しています:MPLAB X IDE V3.55、XC8 V1.41、PICKIT3デバッガケーブルを備えたエクスプローラ8ボード上のPIC18F26K40。

詳細:のような単純なケースでは

:私は、ハードウェアでこれを実行すると

uint8_t myvar = 0x55; 

void main(void) 
{ 
    uint8_t var = myvar; 
} 

デバッガMYVARで変数ウィンドウを使用するには、常にゼロです。しかし、シミュレータで同じコードを実行しても問題ありません。

私が持っている:

  • は、コンパイラの最適化無効にしようとしました、問題を再現単純な形にまで問題が壊れた - 「ファイル内の値を確認するこの

が解決しませんレジスタのデバッガウィンドウ。ハードウェアで実行しても0x55は表示されませんが、シミュレータ(アドレス0x21)にはそこにあります。

場合には、ハードウェアでの作業を行います。Const

  • MYVARが(メイン内で)ローカルで宣言して初期化されるように私は、構造体を使用する場合MYVARが
  • 今すぐ宣言して初期化される

    • 次のような単純なuint8_tの代わりにtypeを使用します。

      typedef struct { 
          uint8_t a; 
          char b[8]; 
      }MYSTRUCT; 
      
      MYSTRUCT ms = { 0x55, "HELLO" }; 
      
      void main(void) 
      { 
          uint8_t var = ms.a; 
      } 
      

      ms変数はinitiaシミュレーションでは適切にライズされたが、ハードウェアではライズされなかった。今回は、変数がmainまたはglobalとして宣言されていれば初期化されません。繰り返しますが、constとして宣言すると動作します。 だからここに矛盾があるように思われる:myVarには初期化されるようにしようとしますが、ハードウェアだけではない、いくつかの理由のためであるように見えるファイル(の.as)のデバッグおよびアセンブラでのステップ実行した後

                 uint8_t  struct type 
      global variable declaration and initialisation  N  N 
      global const declaration and initialisation  Y  Y 
      local variable declaration and initialisation  Y  N 
      

      。 以下は、.asファイルの該当する行を参照してください。キーステージのアドレスと値は、シミュレーション中にデバッガからキャプチャされたものとして表示されます。最後に '__pdataCOMRAM'(myVarのramへのポインタ)に0x55が割り当てられています。ハードウェアでこれを実行すると、すべてのステップが同じになりますが、最後に到達すると '__pdataCOMRAM'の値は0x55ではなく0x00になります。

                  Address Value 
      
      global __pdataCOMRAM 
      __pdataCOMRAM: 
          file "main.c" 
          line 32 
      global _myVar 
          myVar:           0x21 0x00 
          ds  1   
          file "dist/C18_18F87K22/debug\initTest.X.debug.as"  
          line #  
      psect cinit  
      ; Initialize objects allocated to COMRAM (1 bytes)  
          global __pidataCOMRAM        0x144 0xff55 
          ; load TBLPTR registers with __pidataCOMRAM 
          movlw low (__pidataCOMRAM)   
          movwf tblptrl  
          movlw high(__pidataCOMRAM)   
          movwf tblptrh  
          movlw low highword(__pidataCOMRAM)   
          movwf tblptru  
          tblrd*+ ;fetch initializer   
          movff tablat, __pdataCOMRAM+0     0x21  0x55 
      

      アムは、私がここに馬鹿に何かをやったり、私が欠けているか、それはコンパイラやデバッガのバグであるコンパイラオプションはありますか? 私はこの問題を理解したいので、私の開発にはそれ以上の落とし穴はありません。

      乾杯、 スティーブ

    +0

    リンカスクリプトを見てください。私が理解できる限り、スタートアップコードはフラッシュ '.data'セクションからラムからinitグローバル変数へのコピーを実行しません。すべてのグローバル変数は '.bss'セクションと見なされるので、起動時にゼロになるようです。静的な 'uint8_t myvar = 0x55'と宣言しようとしましたか? – LPs

    +0

    これはマイクロコントローラの一般的なプログラミングで非常に一般的なエラーです。この特定のツールチェーンはわかりませんが、「最小限のスタートアップ」や「ファストスタートアップ」などのプロジェクトを作成した可能性があります。新しいプロジェクトを作成し、「標準スタートアップ」、「ANSIスタートアップ」などのオプションがあるかどうかを確認します。 – Lundin

    +0

    最適化コンパイラは 'uint8_t var = myvar;'の指定を 'var'の使用が決して使われないので、' var'の割り当て全体を削除することができます。 _something_を 'var'で実行します。デバッガを使わずに見えるものです。 – chux

    答えて

    2

    リセット直後プログラムメモリへのアクセスを停止し、既知のシリコン問題があると思われます。回避策としてERRATAマクロ 'NVMREG'があります。解決する具体的な手順は次のとおりです。 プロジェクトオプション 'Conf'> 'XC8グローバルオプション'> 'XC8リンカ'を選択し、[追加オプション]カテゴリを選択し、NVRREGをエラータオプションに追加します。 それから、すべてうまくいきました。 マイクロチップフォーラムで1and0のクレジットを獲得しました!

    +1

    良い私はマイクロチップワールドを離れてうれしいです... – LPs

    関連する問題