組み込みCプログラムの存続期間中にコードを1回実行する


8

プログラムの存続期間中にコードスニペットを1回だけ実行するにはどうすればよいですか?何度もオフにしたりオンにしたりできます。コードスニペットを再度実行する唯一のオプションは、ボードを再度フラッシュすることです。

コードは、再実行したくない校正セクションです。EEPROMまたはフラッシュを使用する場合は、フラグをtrueまたはfalseに設定します。では、そのメモリ位置を最初に読み取ったとき、そのメモリ領域のランダムな値は何でしょうか?

これを組み込みCに実装する最良の方法は何ですか?


5
フラグを使用して、このフラグをeeprom(またはフラッシュ)に保存します。毎回、eepromからフラグを読み取ります。初めての瞬間、フラグの値は関数の実行を強制します。その後、フラグの値を変更して、eepromに再度保存できます。それ以外の場合、フラグ値は関数の実行を強制しません。
hoo2

2
あなたが何を求めているのかはっきりしない。
old_timer

2
コードが2回実行されないようにする背後にある動機は何ですか?コードをリバースエンジニアリングできないことが重要ですか?その場合、フラグをバイパスするように設定しても十分に安全ではない可能性がありますか?コードを2回実行するとハードウェアが損傷しますか?システムが初めて使用されるときにチュートリアルメッセージを表示するなど、UXのことですか?その場合、「ファクトリーリセット」機能(存在する場合)がコードをトリガーして再度実行することが望ましい場合がありますか?
Micheal Johnson

5
一般的に、何かが最初にめちゃくちゃになった場合、またはシステムを別のセットアップで再調整する必要がある場合、またはハードウェアの経年劣化などを補償する必要がある場合は、再調整を許可することをお勧めします。たとえば、調整を混乱させる傾向があります。何をすべきかわからないので初めて。
Micheal Johnson

3
それを実行するように命令する方法があるようにコードを設定するのはどうですか(つまり、シリアルポート経由で何かを送ります)。この方法では、不揮発性メモリに煩わされる必要はなく、管理された方法で製造中にキャリブレーションをトリガーできます。
alex.forencich

回答:


18

マイクロコントローラーには、フラグを設定できるEEPROM、OTPメモリ、ユーザーヒューズビットが含まれている場合があります。

「組み込みCに最適な方法」はありません。不揮発性メモリの書き込みはすべてのマイクロコントローラーで異なります。

編集:

閃光

フラッシュメモリの内容は、デバイスのプログラミング中に消去されます。プログラミング後、書き込まれなかったすべてのバイトには0xFFが含まれます。実行中のファームウェア内から安全にプログラムできる領域を見つけるには、データシートを参照してください。

EEPROM

データシートでは保証されていませんが、これまでに見たすべてのEEPROMには、工場出荷時に0xFF:sが含まれていました(一意のMACアドレスで事前にプログラムされたものを除き、明示的に文書化されています)。一部のプログラミングデバイス/ソフトウェアは、EEPROMの内容を消去またはプログラムすることもできます。一部は永続的または可逆的に書き込み保護できます。

OTP

ワンタイムプログラマブルメモリには、データシートに記載されている明確に定義された初期値が常に含まれています。

書き込まれたデータにCRC32のような適切なチェックサムを含めて、欠陥部品、伝送エラー、宇宙線などによるデータの破損から保護することは、常に良い考えです。


EEPROMまたはフラッシュを使用する場合は、フラグをtrueまたはfalseに設定します。そのため、最初にそのメモリ位置を読み取ると、そのメモリ領域のランダムな値は何になりますか。
ganeshredcobra 2016

2
製造中にEEPROMをリセットします(可能な場合はプログラマーを使用するか、または無意味な小さなワイパープログラムを作成してフラッシュし、通常数秒間電源を投入してから、製造プログラムに読み込みます)。
Nick T

13

あなたが言った:

そのコードを実行する唯一のオプションは、ボードを再度フラッシュする必要があります。

他の人は、EEPROMを使用して、run_once()関数がいつ実行されたかを示すフラグを保存すると述べています。ただし、これには欠点があります。マイクロコントローラーを再フラッシュすると、EEPROMのran_it_onceフラグがすでに設定されており、run_once()関数は実行されません。マイクロコントローラーにEEPROMが組み込まれている場合、プログラマーがこれをサポートしていれば、マイクロコントローラーを再フラッシュするときにran_it_onceフラグをクリアできる可能性があります。

より良い方法は、EEPROMとコードの両方にバージョン番号を含めることです。電源投入からコードを実行する場合、EEPROMからバージョン番号を読み取り、コードに格納されているバージョン番号と比較する必要があります。それらが一致しない場合、run_once()関数が呼び出され、run_once()コードの最後の動作は、ファームウェアのバージョン番号をEEPROMに書き込むことです。ファームウェアのソースコードを変更するたびに、それに埋め込まれているバージョン番号をインクリメントする必要があります。


1
これは、ユーザーが行ったすべての操作がマイクロコントローラーの再フラッシュであり、再度実行する必要がある場合(そのシナリオでは)、ブールフラグと同じ問題が発生します。ファームウェアが更新され、再実行する必要がある場合、問題は確実に解決されます。
テゴスト

8

独自のプログラムメモリを書き込み/消去できるマイクロコントローラを選択してください。問題のコードを実行した後、コードの最後の部分で最初の命令をバイパスするジャンプに置き換えます。必要に応じて、残りを消去することもできます(おそらくnopで置き換えます)。これにより、再度実行される可能性はまったくありません。

このメッセージは5..4で自己破壊されます...


1
この答えは賢いかもしれませんが、それは不必要に複雑だと思います。おそらく、コードメモリ外の永続メモリが利用できない場合にのみ使用するように指定するメモを使用できますか?
skrrgwasme

他の解決策が可能であっても、他の解決策よりも理解しやすいと思います。
ジョシュア

1
他の解決策が可能だったとしても、ソースコードレベルで理解するのは非常に難しいと思います。
CVn

ほとんどのPICには35の命令しかありません...何が問題になるのでしょうか?;)
rdtsc

5

このコードをキャリブレーションに使用しているので、最初のステージとしてキャリブレーションコードを実行するブラストプロセスを作成し、完成した製品バージョンのボードでは使用しないことをお勧めします。これは、apalopohapaの回答に似ていますが、2つの別々のプログラムロードがあるという意味で異なります。すべてのキャリブレーションを実行し、そこからデータを吐き出す最初のプログラムロードをフラッシュするブラストプロセスがあります。次に、そのデータを取得して、2番目のプログラムロードのデータに組み込みます。

このアプローチの利点の1つは、必要なストレージスペースの量を完全に最小化できることです。1回限りのコードを格納する必要はなく、コードが生成するデータのみを格納する必要があります。2つの別々のプログラムをロードするブラストプロセスを使用することで、初期化コードのバグから少し離れて、他の方法で長引く可能性もあります。調整コードを再実行したい場合は、柔軟性も追加されます。コードが実行されたことを示すビットをクリアするために追加のコードを記述する必要はありません(誤って既にクリアされてしまう可能性があります)。ブラストプロセス。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.