依存し、これは一般的にC30だけでなくすべてのツールに当てはまります。
最適化は、多くの場合、さまざまな方法でコードを削除および/または再構築します。switchステートメントはif / elseコンストラクトで再実装されるか、場合によってはすべて削除される可能性があります。y = x * 16は一連の左シフトなどに置き換えられる可能性がありますが、この最後のタイプの最適化は通常ステップスルーできますが、ほとんどはyaを取得する制御ステートメントの再構築です。
これにより、Cで定義した構造がもはや存在しないため、デバッガーをCコードでステップ実行できなくなります。これらの構造は、コンパイラーによって置き換えられるか、コンパイラーがより高速であるか、スペースを節約すると信じられるものに並べ替えられたためです。また、ブレークする命令が存在しない可能性があるため、Cリストからブレークポイントを設定できないようにすることもできます。たとえば、ifステートメント内にブレークポイントを設定しようとしても、コンパイラがそのifを削除した可能性があります。whileループまたはforループ内にブレークポイントを設定しようとする場合がありますが、コンパイラーはループが存在しないようにそのループを展開することにしました。
このため、最適化をオフにしてデバッグできる場合、通常は簡単です。常に最適化をオンにして再テストする必要があります。これは、重要volatile
なエラーを見逃し、断続的な障害(またはその他の奇妙な現象)を引き起こすことがわかる唯一の方法です。
組み込み開発の場合、とにかく最適化に注意する必要があります。具体的には、タイミングが重要なコードのセクション、たとえばいくつかの割り込み。これらの場合、アセンブリのクリティカルビットをコーディングするか、コンパイラディレクティブを使用して、これらのセクションが最適化されないようにして、実行時間が固定または最悪の場合の実行時間が固定されるようにします。
他の落とし穴はコードをuCに適合させることができるため、コードをチップに単純に適合させるためにコード密度の最適化が必要になる場合があります。これは、通常、ファミリ内で最大のROM容量uCから開始し、コードがロックされた後、製造用に小さいもののみを選択することをお勧めする理由の1つです。