プログラムの存続期間中にコードスニペットを1回だけ実行するにはどうすればよいですか?何度もオフにしたりオンにしたりできます。コードスニペットを再度実行する唯一のオプションは、ボードを再度フラッシュすることです。
コードは、再実行したくない校正セクションです。EEPROMまたはフラッシュを使用する場合は、フラグをtrueまたはfalseに設定します。では、そのメモリ位置を最初に読み取ったとき、そのメモリ領域のランダムな値は何でしょうか?
これを組み込みCに実装する最良の方法は何ですか?
プログラムの存続期間中にコードスニペットを1回だけ実行するにはどうすればよいですか?何度もオフにしたりオンにしたりできます。コードスニペットを再度実行する唯一のオプションは、ボードを再度フラッシュすることです。
コードは、再実行したくない校正セクションです。EEPROMまたはフラッシュを使用する場合は、フラグをtrueまたはfalseに設定します。では、そのメモリ位置を最初に読み取ったとき、そのメモリ領域のランダムな値は何でしょうか?
これを組み込みCに実装する最良の方法は何ですか?
回答:
マイクロコントローラーには、フラグを設定できるEEPROM、OTPメモリ、ユーザーヒューズビットが含まれている場合があります。
「組み込みCに最適な方法」はありません。不揮発性メモリの書き込みはすべてのマイクロコントローラーで異なります。
編集:
閃光
フラッシュメモリの内容は、デバイスのプログラミング中に消去されます。プログラミング後、書き込まれなかったすべてのバイトには0xFFが含まれます。実行中のファームウェア内から安全にプログラムできる領域を見つけるには、データシートを参照してください。
EEPROM
データシートでは保証されていませんが、これまでに見たすべてのEEPROMには、工場出荷時に0xFF:sが含まれていました(一意のMACアドレスで事前にプログラムされたものを除き、明示的に文書化されています)。一部のプログラミングデバイス/ソフトウェアは、EEPROMの内容を消去またはプログラムすることもできます。一部は永続的または可逆的に書き込み保護できます。
OTP
ワンタイムプログラマブルメモリには、データシートに記載されている明確に定義された初期値が常に含まれています。
書き込まれたデータにCRC32のような適切なチェックサムを含めて、欠陥部品、伝送エラー、宇宙線などによるデータの破損から保護することは、常に良い考えです。
あなたが言った:
そのコードを実行する唯一のオプションは、ボードを再度フラッシュする必要があります。
他の人は、EEPROMを使用して、run_once()関数がいつ実行されたかを示すフラグを保存すると述べています。ただし、これには欠点があります。マイクロコントローラーを再フラッシュすると、EEPROMのran_it_onceフラグがすでに設定されており、run_once()関数は実行されません。マイクロコントローラーにEEPROMが組み込まれている場合、プログラマーがこれをサポートしていれば、マイクロコントローラーを再フラッシュするときにran_it_onceフラグをクリアできる可能性があります。
より良い方法は、EEPROMとコードの両方にバージョン番号を含めることです。電源投入からコードを実行する場合、EEPROMからバージョン番号を読み取り、コードに格納されているバージョン番号と比較する必要があります。それらが一致しない場合、run_once()関数が呼び出され、run_once()コードの最後の動作は、ファームウェアのバージョン番号をEEPROMに書き込むことです。ファームウェアのソースコードを変更するたびに、それに埋め込まれているバージョン番号をインクリメントする必要があります。
独自のプログラムメモリを書き込み/消去できるマイクロコントローラを選択してください。問題のコードを実行した後、コードの最後の部分で最初の命令をバイパスするジャンプに置き換えます。必要に応じて、残りを消去することもできます(おそらくnopで置き換えます)。これにより、再度実行される可能性はまったくありません。
このメッセージは5..4で自己破壊されます...
このコードをキャリブレーションに使用しているので、最初のステージとしてキャリブレーションコードを実行するブラストプロセスを作成し、完成した製品バージョンのボードでは使用しないことをお勧めします。これは、apalopohapaの回答に似ていますが、2つの別々のプログラムロードがあるという意味で異なります。すべてのキャリブレーションを実行し、そこからデータを吐き出す最初のプログラムロードをフラッシュするブラストプロセスがあります。次に、そのデータを取得して、2番目のプログラムロードのデータに組み込みます。
このアプローチの利点の1つは、必要なストレージスペースの量を完全に最小化できることです。1回限りのコードを格納する必要はなく、コードが生成するデータのみを格納する必要があります。2つの別々のプログラムをロードするブラストプロセスを使用することで、初期化コードのバグから少し離れて、他の方法で長引く可能性もあります。調整コードを再実行したい場合は、柔軟性も追加されます。コードが実行されたことを示すビットをクリアするために追加のコードを記述する必要はありません(誤って既にクリアされてしまう可能性があります)。ブラストプロセス。