Arduino:检测代码信息

时间:2017-09-29 15:31:26

标签: arduino arduino-uno

有没有办法检测代码版本或上次更新的任何信息,代码大小或二进制代码大小?

以下是示例:

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  // turn the LED on (HIGH is the voltage level)
  delay(1000);
  // wait for a second
  digitalWrite(LED_BUILTIN, LOW);
  // turn the LED off by making the voltage LOW
  delay(1000);
  // wait for a second
}

如果我将代码上传到Arduino板,我可以在Arduino中检测有关代码大小或上次修改时间或上传时间等的任何信息吗?

感谢。

2 个答案:

答案 0 :(得分:1)

编译日期存储在__DATE__宏中,编译时的当前系统时间存储在__TIME__宏中。同样有用的可能是__FILE__宏,它存储文件名。参考(和其他相关宏):http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_preprocessor.Pre-defined_macros.html

这里有一些有趣的讨论:

https://github.com/arduino/Arduino/issues/5618

在该线程中,他们正在讨论在编译/上传时存储代码的Git哈希的方法。如果您正在使用Git版本控制,那么信息可能比上次修改时间或代码大小更有用,可以确定您的微控制器上正在运行哪个版本并且能够轻松检索该版本。我不确定在每次上传时自动执行提交有多疯狂,你可以在测试完成后再将它们压缩。如果您不使用Git,可以采用相同的技术来添加您喜欢的任何其他版本信息,甚至可以自动备份该版本的代码。

正如该线程中的facchinm所解释的那样,最新版本的Arduino IDE在整个构建过程中提供了可用于添加其他操作的钩子。参见:

https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification#pre-and-post-build-hooks-since-ide-165

original proposal是将版本信息存储在EEPROM中。我相信最常见的方法是通过.eep文件。这个想法的一个问题是Arduino Uno使用的流行的Optiboot引导加载程序以及流行的第三方硬件包不支持在上载期间写入EEPROM(为了使引导加载程序适合0.5 kB引导部分)。您还需要避免因草图使用相同的EEPROM地址而导致的冲突。

other thought代替将其存储在代码本身中。我想这可以通过使用钩子来自动更新头文件"库"这包含在草图中。 e.g:

#include <VersionTracker.h>

现在您如何访问该信息?您可以在草图中使用代码在请求或启动时发送该信息。一个简单的例子:

void setup() {
  Serial.begin(9600);
  Serial.print(F("Filename: "));
  Serial.println(F(__FILE__));
  Serial.print(F("Compilation timestamp: "));
  Serial.println(F(__DATE__ " " __TIME__));
}

void loop() {}

将在启动时将此信息打印到串行监视器。当然,您可以使用任何其他通信方法。这种事情会增加一些重要的开销,因此从微控制器下载固件然后找出一种从反汇编中查找版本信息的方法可能更为可取(如果不那么初学者友好)。

答案 1 :(得分:0)

你无法得到的时间。 Arduino没有时钟或任何方式知道时间。

如果您使用AvrDude从芯片中读取十六进制代码然后查看您回读的内容的大小,则可以获得代码大小。