代替ビュー:マイクロコントローラーはメモリ不足になりません。
少なくとも、適切にプログラムされたときはそうではありません。マイクロコントローラーのプログラミングは、汎用プログラミングとまったく同じではありません。適切に行うには、その制約を認識し、それに応じてプログラミングする必要があります。これを確実にするツールがあります。それらを検索して学習します-少なくともリンカースクリプトと警告の読み方。
しかし、Majenkoらが言うように、不適切にプログラムされたマイクロコントローラーはメモリを使い果たしてから、無限ループ(少なくともウォッチドッグタイマーにリセットの機会を与えます。ウォッチドッグタイマーを有効にしましたか?) )
マイクロコントローラの一般的なプログラミングルールはこれを回避します。たとえば、すべてのメモリはスタックに割り当てられるか、静的に(グローバルに)割り当てられます。「new」または「malloc」は禁止されています。再帰も同様であるため、サブルーチンのネストの最大の深さを分析し、使用可能なスタックに収まるように表示できます。
したがって、プログラムがコンパイルまたはリンクされるときに必要な最大ストレージを計算し、ターゲットとする特定のプロセッサのメモリサイズ(リンカースクリプトでエンコードされることが多い)と比較できます。
その場合、マイクロコントローラーはメモリ不足にならないかもしれませんが、プログラムはそうかもしれません。そしてその場合、あなたは
- 書き換える、より小さい、または
- より大きなプロセッサを選択します(多くの場合、さまざまなメモリサイズで使用できます)。
マイクロコントローラプログラミングの一般的なルールセットの1つは、モーター業界で採用されているMISRA-Cです。
私の考えでは、AdaのSPARK-2014サブセットを使用するのがベストプラクティスです。Adaは、実際にはAVR、MSP430、ARM Cortexなどの小さなコントローラーをターゲットとしており、本質的にCよりもマイクロコントローラープログラミングの優れたモデルを提供します。
これで、SPARKツールはこれらの注釈を含むプログラムを分析し、そのプロパティを証明します(または潜在的なエラーを報告します)。誤ったメモリアクセスや整数オーバーフローに対処するために時間やコードスペースを無駄にする必要はありません。これらは決して発生しないことが証明されているからです。
SPARKにはより多くの先行作業が含まれますが、経験から、製品をより速く、より安価に入手できることが示されています。
MISRA-CとSPARKの比較