誰かがこれを助けることができますか?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
今すぐ宣言して初期化される
- 次のような単純な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
アムは、私がここに馬鹿に何かをやったり、私が欠けているか、それはコンパイラやデバッガのバグであるコンパイラオプションはありますか? 私はこの問題を理解したいので、私の開発にはそれ以上の落とし穴はありません。
乾杯、 スティーブ
リンカスクリプトを見てください。私が理解できる限り、スタートアップコードはフラッシュ '.data'セクションからラムからinitグローバル変数へのコピーを実行しません。すべてのグローバル変数は '.bss'セクションと見なされるので、起動時にゼロになるようです。静的な 'uint8_t myvar = 0x55'と宣言しようとしましたか? – LPs
これはマイクロコントローラの一般的なプログラミングで非常に一般的なエラーです。この特定のツールチェーンはわかりませんが、「最小限のスタートアップ」や「ファストスタートアップ」などのプロジェクトを作成した可能性があります。新しいプロジェクトを作成し、「標準スタートアップ」、「ANSIスタートアップ」などのオプションがあるかどうかを確認します。 – Lundin
最適化コンパイラは 'uint8_t var = myvar;'の指定を 'var'の使用が決して使われないので、' var'の割り当て全体を削除することができます。 _something_を 'var'で実行します。デバッガを使わずに見えるものです。 – chux