keilC51コンパイルの一般的なエラーと警告

たとえば、コンパイルエラーに関心のあるネチズンが、頻繁に発生するエラー情報を収集し、それを要約して共有するための最終的な解決策を提案できる場合です。

(1)L15リピートコール
***警告L15:セグメント
セグメントへの複数の呼び出し:?PR?SPI_RECEIVE_WORD?D_SPI
CALLER1:?PR?VSYNC_INTERRUPT?MAIN
CALLER2:?C_C51STARTUP

この警告は、コネクタが関数がメインである可能性があることを検出したことを意味します関数割り込みサービスルーチン(または割り込みサービスルーチンを呼び出す関数)と同時に呼び出されるか、複数の割り込みサービスルーチンによって同時に呼び出されます。
この問題の理由の1つは、関数の実行時にこの関数がリエントラント関数ではない
ため、からの割り込みによって中断され、結果が変化し、さまざまな形式の競合が発生する可能性があることです(つまり、関数内の一部のデータが失われた場合、リエントラント機能はいつでもISRによって中断される可能性があり、一定期間後に再び実行できますが、対応するデータは失われません)。
2番目の理由は、ローカル変数と変数に使用されるメモリ領域(このように変換され、引数、[引数、引数の値、プログラムまたはサブルーチンの値を決定するために使用される])がのメモリ領域でカバーされていることです。他の関数。この関数が中断されると、そのメモリ領域が使用され、他の関数と
メモリの競合が発生します。

たとえば、最初の警告では、関数WRITE_GMVLX1_REGがD_GMVLX1.CまたはD_GMVLX1.A51で定義されています。これは、割り込み
サービスルーチンまたは割り込みサービスルーチンを呼び出す関数によって呼び出されます。呼び出し元の関数は、MAIN.CのVSYNC_INTERRUPTです。 。

解決策:
2つの関数が同時に実行されることはなく(関数がメインプログラムによって呼び出され、割り込みが無効になっている)、関数がメモリを占有しない場合(レジスタのみが使用されていると仮定)、次のことができます。この警告は完全に無視してください。
関数がメモリを占有している場合は、リンカーOVERLAYコマンドを使用して、オーバーレイ
分析から関数を削除する必要があり
ます。次に例を示します。OVERLAY(?PR?_WRITE_GMVLX1_REG?D_GMVLX1!*)
上記のコマンドは、関数が使用されないようにします。メモリ領域がカバーされます。他の機能によって。この関数で他の関数が呼び出され、これらが
プログラムの他の場所で呼び出される場合は、これらの関数もオーバーレイ分析から除外する必要がある場合があります。このOVERLAY命令
により、コンパイラーは上記の警告メッセージを削除できます。
関数の実行中に関数を呼び出すことができる場合、状況はさらに複雑になります。このとき、次の方法が使用できます
。1。メインプログラムが関数を呼び出すときに割り込みを禁止し、関数を呼び出すときに#pragma disableステートメントを使用して、割り込みを禁止する目的を達成できます。
カバレッジ分析から関数を削除するには、OVERLAY命令を使用する必要あります。
2.機能コードの2つのコピーをコピーします。1つはメインプログラムにコピーし、もう1つは割り込みサービスルーチンにコピーします。
3.関数を再入可能に設定します。例:void myfunc(void)reentrant { ... }


この設定により、関数値とローカル変数を格納するために使用される再入可能スタックが生成されます。この方法を使用する場合、再入可能スタックはSTARTUP.A51ファイルで構成する必要があります。この方法はより多くのRAMを消費し、リエントラント関数の実行速度を低下させます。

(2)M51ファイルがない
ことを示すプロンプトを表示します。コンパイルすると、次のプロンプトが表示されます
。F:\ ... \ XX.M51
ファイルがエディターの外部で変更されました。リロードしますか?
------

解決策:
プロジェクトを再生成し、STARTUP.A51を生成します。

(3)L16呼び出しなし
***警告L16:
呼び出しられていないセグメント、オーバーレイプロセスセグメントでは無視されます:?PR?_COMPARE?TESTLCD
説明:COMPARE(またはフラグメント)などのプログラムの一部の関数は、(デバッグ中に)以前に呼び出されたことがありません。 、または
それを呼び出すステートメントはまったくありません
この警告メッセージの前に、どの機能が問題を引き起こしたかを示すメッセージがあるはずです。簡単な調整を行うだけ
です。それを無視するのは大したことではありません。
解決策:COMPARE()関数を削除するか、条件付きコンパイル#if…..#endifを使用して、この関数を保持し、コンパイルしないようにします。

(4)L10およびL16「メインプログラムの名前が間違っている(またはメインプログラムがない)」
プログラム内:
void mian(void)
コンパイルプロンプト:
***警告L16:コールされていないセグメント、オーバーレイプロセスセグメントでは無視
:?PR?MIAN?MAIN
***警告L10:ルートセグメントを判別できませんプログラムサイズ:data = 8.0 xdata = 0 code = 9
---

変更:
メインがありませんプログラム(実際にはタイプミス)、mianをmainに変更

(5)以前に定義された関数
L16メインプログラムでは使用されません。以前に定義された関数はメインプログラムでは使用されません。コンパイルすると、次のように表示されます。
***警告L16 :コールされていないセグメント、オーバーレイプロセスセグメントでは無視
:?PR?DELAY?MAIN


(6)L210
ビルドターゲット「ターゲット1」アセンブル
STARTUP.A51 ...
コンパイルテスト.C ...
リンク...
BL51バンクリンカー/ロケーターV6 .00-SN:K1JXC-94Z4V9
COPYRIGHT KEIL ELEKTRONIK GmbH 1987-2005
"STARTUP.obj"、
"test.obj"
TO "test"
***致命的なエラーL210:入力ファイルのI / Oエラー:
例外0021H:パスまたはファイルが
見つかりませんファイル:test.obj
ターゲットが作成されていません

---------
設定の問題、プログラムでシールドしてください#pragma src十分です

(7)C206関数が定義されていません関数が定義されて
いません
MAIN。C(15):警告C206: 'delay1':関数がありません-プロトタイプ(8)C141セミコロンが少ない
プログラムの一部:
{ pval = P1 P3 = pval; }コンパイルプロンプトエラー:MAIN.C(22):エラーC141:「P3」付近の構文エラー修正:P1の後に「;」が続く(9)C129アセンブリとCサフィックスの問題(このような小さなプログラムの作成など) c0 .c、エラーc129、ミスとして保存します。コンパイル時に0000が表示される前に、c0.asmとして保存した場合、このエラーは発生しません。cとして保存した場合は、最初にc51コンパイラを呼び出し、要件に従ってコンパイルします。 c言語の場合、エラーが発生します。keilcコンパイラを具体的に紹介している書籍を参照できます。(10)配列引用符の問題に関するC101およびC141













次の配列が定義されています:
unsigned char
a [36] = {'0xfe'、 '0xfd'、 '0xfb'、 '0xf7'、 '0xef'、 '0xdf'、 '0xbf'、 '0x7f'、 '0x7e'、 '0x7d'、 '0x7b'、 '0x77'、 '0x6f'、 '
0x5f'、 '0x3f'、 '0x3e'、 '0x3d'、 '0x3b'、 '0x37'、 '0x2f'、 '0x1f'、 '0x1e '、' 0x1d '、' 0x1b '、' 0x17 '、' 0x0f '、' 0x0e '、'
0x0d '、' 0x0b '、' 0x07 '、' 0x06 '、' 0x05 '、' 0x03 '、' 0x02 '、 '0x01'、 '0x00'};
ただし、コンパイル時に常に失敗しますエラーメッセージは次のとおりです。
ビルド
ターゲット 'ターゲット1'コンパイルshaomiao.c ...
SHAOMIAO.C(3):エラーC101: '' 0 ' :無効な文字定数
SHAOMIAO.C(3):エラーC141:'xfe'
付近の構文エラーSHAOMIAO.C (3):エラーC101: ''} ':無効な文字定数
ターゲットが作成されていません

解決策:' ... '引用符を削除してください

(11)C100およびC141およびC129プログラムに中国語の句読点があります
次のように、keilでコンパイルするとエラーが発生します。D:\ KEIL \ C51 \ INC \ REG52.H(1):エラーC100:印刷できない文字0xA1が
スキップされました上記と同じように、多くのエラーがあり、D:\ KEIL \ C51 \ INC \ REG52 .H(2):エラーC141:「#」の近くの構文エラー
D:\ KEIL \ C51 \ INC \ REG52.H(2):エラーC129:「<」の前に「;」

がありませんがreg52.hヘッダーfile is keilビルトイン(下記参照)、なぜエラーを報告するのですか?
----
回答:プログラムには中国語の句読点があります。英語で書き直してください

(12)A45数字と文字が混同されたコンパイル
MOV PO、A;次の11に置く
...
MOV RO、#0FFH; 14
MOV R1 、#OFFH; 15
...
DJNZ RO、DLY_LP; 19
MOV R0、#OFFH; 20
...
コンパイル後:
ledtest.asm(11):エラーA45:
未定義の記号(PASS-2)ledtest.asm(14) :エラーA45:未定義の記号(PASS-2)
ledtest.asm(15):エラーA45:未定義の記号(PASS-2)
ledtest.asm(19):エラーA45:
未定義のシンボル(PASS-2)ledtest.asm(20):エラーA45:未定義のシンボル(PASS-2)
ターゲットが作成されていません

---------
注:
文字「O」と数字「0」。主な欠点はここにあります。
数字の「0」を入力し、文字「O」を入力します。

(13) 警告280: 'i':参照されていないローカル変数
は、ローカル変数iが関数でアクセスされていないことを示します。解決策関数でi変数の宣言を削除します。2警告206: 'Music3':関数がありません-プロトタイプ
説明Music3()関数が宣言されていないか、他の関数への外部呼び出しを
解決できないため宣言されていませんメソッドについて説明しますvoid Music3(void)他のファイルの関数として宣言されている場合は、プログラムの最前線に書き込みます
externに書き込むvoidMusic3(void)、これは外部宣言です

3コンパイル:C:\ 8051 \ MANN.C
エラー:318: 'ファイルを開くことができません' beep.h'main.c
がで使用されていることを意味しますC:\ 8051 \ MANN.C命令#をコンパイルするプロセスには「beep.h」が含まれますが、
しかし、問題の解決策が見つかりません。beep.hのインクルードファイルを作成し、c:\ 8051

(14)Compling:C:\ 8051 \ LED.C
エラー237
の作業ディレクトリに保存します: 'LedOn ':functionにすでに本文がある
ということは、LedOn()関数名が繰り返し定義されていること、つまり、同じ関数名が3つ以上あることを意味します。
解決策関数名の1つを修正して、関数名が独立するようにします

15)***警告16:オーバーレイプロセスセグメントでは無視されるアンコールされたセグメント
:?PR?_DELAYX1MS?DELAY

は、DelayX1ms()関数が他の関数によって呼び出されず、プログラムのメモリスペースを占有することを示しています。解決策DelayX1ms()関数を削除するか、条件付きコンパイルを使用します。次の場合…..#endif、コンパイルせずにこの関数を保持できます

(16)***警告6:XDATA SPACE MEMORY OVERLAP
FROM:0025H
TO:0025H

外部データROMの0025Hが定義アドレスを繰り返すことを説明します。
解決策定義外部データROM
の名前は次のとおりです。PdataunsignedcharXFR_ADC _at_0x25 XFR_ADC変数の名前は0x25です。他の変数名も0x25で定義されているかどうかを確認し、修正してください

(17)警告206: 'DelayX1ms':関数がありません-プロトタイプ
C:\ 8051 \ INPUT.C
エラー267:「DelayX1ms」:ANSIスタイルのプロトタイプが必要C:\ 8051 \ INPUT.C

は、DelayX1ms関数がプログラムで呼び出されているが、関数が定義されていないことを示しています。つまり、プログラムの内容が書き込まれていないか、関数が定義されていますが、
ソリューションは宣言されていません。コンテンツの書き込み後にDelayX1msアナウンスを書き込むか、外部アナウンスを作成します。delay.hのインクルードファイルで外部として宣言して、他の関数を呼び出すことができます

(18)***警告1:未解決の外部シンボル
SYMBOL:MUSIC3
MODULE:C:\ 8051 \ MUSIC .OBJ(MUSIC)
***警告2:REFERENCE MADE TO未解決の外部
シンボル:MUSIC3
MODULE:C:\ 8051 \ MUSIC.OBJ(MUSIC)
ADDRESS: 0018H

は、プログラムがMUSIC関数を呼び出したが、関数の拡張子が含まれていないことを示しています。ファイルCは、コンパイルと接続のためにプロジェクトファイルPrjに追加されます。
解決策MUSIC CでMUSIC3関数を設定し、プロジェクトファイルにMUSIC Cを追加します

( 19)***エラー107:追加スペースのオーバーフロースペース
:データ
セグメント:_DATA_GOUP_長さ
:0018H
***エラー118:誤った外部への参照
記号:ボリューム
モジュール:C:\ 8051 \ OSDM.OBJ(OSDM)
アドレス:4036H

ストレージモードがの場合、関数内のパブリック変数とローカル変数の数が0〜0x7fの場合、データストレージスペースのアドレス範囲が0〜0x7fであることを説明します。 SMALLに設定し、次にローカル変数最初に作業レジスタ
R2〜R7を一時ストレージに使用します。メモリが不足している場合は、データタイプスペースが一時ストレージに使用されます。数が0x7fを超えると、アドレスが不足します。
解決策は、データタイプによって定義されたパブリック変数を変更することです。これはidataタイプ(20)の定義です


。***警告L15:セグメント
セグメントへの複数の
呼び出し:?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1:?PR?VSYNC_INTERRUPT?メイン
CALLER2:?C_C51STARTUP
***警告L15:セグメント
セグメントへの複数の呼び出し:?PR?_SPI_SEND_WORD?D_SPI
CALLER1:?PR?VSYNC_INTERRUPT?メイン
CALLER2:?C_C51STARTUP
***警告L15:セグメントへの複数の呼び出し
セグメントSPI_RECEIVE_WORD?D_SPI
CALLER1:?PR?VSYNC_INTERRUPT?MAIN CALLER2:
CALLER2:?C_C51STARTUP

この警告は、関数がメイン関数と割り込みサービスルーチン(または割り込みサービスルーチンを呼び出す関数)によって同時に呼び出されるか、複数の割り込みサービスルーチンによって呼び出される可能性があることをリンカが検出したことを示します。同時。

この問題の理由の1つは、
割り込みが中断された可能性があるときに関数が実行されたときに、この関数がリエントラント関数ではないため、変数の変更の結果、何らかの形式の競合が発生する可能性があることです(つまり、機能が失われ、リエントラント機能はいつでもISRによって中断される可能性があり、一定期間後に再び実行できますが、対応するデータは失われません)。

2番目の理由は、ローカル変数と変数に使用されるメモリ領域(このように変換され、引数、[引数、引数の値、プログラムまたはサブルーチンの値を決定するために使用される])がのメモリ領域でカバーされていることです。他の関数。この関数が中断されると、そのメモリ領域が使用され、他の関数とメモリの競合が発生します。
たとえば、最初の警告では、関数WRITE_GMVLX1_REGがD_GMVLX1.CまたはD_GMVLX1.A51で定義されています。
これは、割り込みサービスルーチンまたは割り込みサービスルーチン
呼び出す関数によって呼び出されます。呼び出し元の関数は、MAIN.CのVSYNC_INTERRUPTです。 。

解決策:
2つの関数が同時に実行されることはなく(関数がメインプログラムによって呼び出され、割り込みが無効になっている)、
関数がメモリを占有しない(レジスタのみが使用されていると想定)
場合は、無視してかまいません。これは完全に警告です。
関数がメモリを占有している場合は、リンカーOVERLAYコマンドを使用して、
オーバーレイ分析から関数を削除する必要があります。次に例を示します。
OVERLAY(?PR?_WRITE_GMVLX1_REG?D_GMVLX1!*)
上記の命令は、この関数が使用するメモリ領域が他の関数によって上書きされるのを防ぎます。
この関数で他の関数が呼び出され、これらがプログラムの他の場所で呼び出された
場合、これらの関数をオーバーレイ分析から除外する必要がある場合があります。このOVERLAY命令
により、コンパイラーは上記の警告メッセージを削除できます。

関数の実行中に関数を呼び出すことができる場合、状況はさらに複雑になります。このとき、次の方法を使用することができます

メインプログラムが関数を呼び出し、関数を実現するために呼び出されたときの#pragma無効のステートメントを使用することができたときに1割り込みは禁止されている
の目的禁止割り込みを。この関数は、OVERLAY命令を使用
してカバレッジ分析から削除する必要があります
2.機能コードの2つのコピーをコピーします。1つはメインプログラムにコピーし、もう1つは割り込みサービスルーチンにコピーします。3.関数を再入可能に設定します。例:
void myfunc(void)reentrant { ... }この設定は、関数値とローカル変数を格納するために使用されるリエントラントスタックを生成します。このメソッドを使用する場合、リエントラントスタックはSTARTUPにある必要があります。 A51ファイル。この方法はより多くのRAMを消費し、リエントラント関数の実行速度を低下させます。(21)。***警告L16:コールされていないセグメント、オーバーレイプロセスセグメントでは無視:?PR?_COMPARE?TESTLCD








説明:プログラム内の一部の関数(またはフラグメント)は、(デバッグ中に)以前
に呼び出されたことがないか、呼び出すステートメントがまったくありません
この警告メッセージの前に、どの機能が問題を引き起こしたかを示すメッセージがあるはずです。簡単な
調整を行うだけです。それを無視するのは大したことではありません。
解決策:COMPARE()関数を削除するか、条件付きコンパイル#if…..#endifを使用して、この関数を保持し、
コンパイルしないようにします。

おすすめ

転載: blog.csdn.net/weixin_38293850/article/details/108031830