如何使代码片段在程序的生命周期中只运行一次?它可以关闭和打开多次。再次运行代码片段的唯一选择必须是再次刷新板。
该代码是我不想再次运行的校准部分。如果我使用 EEPROM 或闪存,我们会将标志设置为真或假。那么,当我们第一次读取该内存位置时,该内存区域中的随机值是多少?
在嵌入式 C 中实现这一点的最佳方法是什么?
如何使代码片段在程序的生命周期中只运行一次?它可以关闭和打开多次。再次运行代码片段的唯一选择必须是再次刷新板。
该代码是我不想再次运行的校准部分。如果我使用 EEPROM 或闪存,我们会将标志设置为真或假。那么,当我们第一次读取该内存位置时,该内存区域中的随机值是多少?
在嵌入式 C 中实现这一点的最佳方法是什么?
您的微控制器可能有一些 EEPROM、OTP 存储器、用户熔丝位,您可以在其中设置一个标志。
没有“嵌入式 C 中的最佳方法”,每个微控制器都编写非易失性存储器不同。
编辑:
闪光
对器件进行编程时会擦除闪存内容。编程后,所有未写入的字节都包含 0xFF。查阅数据表以找到可以从正在运行的固件中安全编程的区域。
EEPROM
虽然数据表中没有保证,但到目前为止,我看到的所有 EEPROM 在出厂时都包含 0xFF:s(除了那些预编程有唯一 MAC 地址的,但已明确记录)。一些编程设备/软件也能够擦除或编程 EEPROM 内容。有些可以写保护,永久或可逆。
一次性密码
一次性可编程存储器始终包含明确定义的初始值,数据表中记录了这些值。
在写入的数据中包含一个好的校验和(如 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 的答案类似,不同之处在于您将有两个单独的程序加载:有一个爆炸过程,它会闪烁第一个程序加载,该加载运行所有校准并从中吐出数据。然后获取该数据并将其合并到第二个程序加载的数据中。
这种方法的一个好处是您绝对可以最大限度地减少所需的存储空间量 - 您不需要存储您曾经唯一的代码,只需存储它生成的数据。通过加载两个单独的程序的爆炸过程,您还可以将自己与初始化代码中的错误隔离开来,否则这些错误可能会一直存在。如果您想重新运行校准代码,您还有一些额外的灵活性:不必编写额外的代码来清除任何表示您的代码已运行的位(可能已经意外地被清除了),您只需重新运行您的爆破过程。