Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我可以通过编程方式检测草图中的更改吗?_C_Arduino_Preprocessor Directive - Fatal编程技术网

C 我可以通过编程方式检测草图中的更改吗?

C 我可以通过编程方式检测草图中的更改吗?,c,arduino,preprocessor-directive,C,Arduino,Preprocessor Directive,在工作中,我们有一个定期更改的Arduino草图。简而言之,它通过串行端口来回通信。在大多数情况下,我们的软件开发团队控制代码;但是,我们公司还有一些其他团队会在最后一刻定期对草图进行更改,以满足客户的特定需求 这显然是一个很大的问题,因为这意味着我们可能会在不同的地方部署不同版本的草图,而没有意识到这一点。我们的软件开发人员非常擅长使用源代码管理,但其他团队没有那么严格 提出的一个想法是硬编码版本号,以便某个串行命令通过报告预定义的版本号进行响应。然而,问题是,如果我们的其他团队决定进行其他更

在工作中,我们有一个定期更改的Arduino草图。简而言之,它通过串行端口来回通信。在大多数情况下,我们的软件开发团队控制代码;但是,我们公司还有一些其他团队会在最后一刻定期对草图进行更改,以满足客户的特定需求

这显然是一个很大的问题,因为这意味着我们可能会在不同的地方部署不同版本的草图,而没有意识到这一点。我们的软件开发人员非常擅长使用源代码管理,但其他团队没有那么严格

提出的一个想法是硬编码版本号,以便某个串行命令通过报告预定义的版本号进行响应。然而,问题是,如果我们的其他团队决定进行其他更改,他们可能同样没有更新版本号的规则

显然,最好的解决方案是切断其他团队进行更新,但假设出于办公室政治原因,这是不可能的,我想知道是否有任何方法可以通过编程方式“反思”Arduino草图。显然,草图将占用一定数量的字节,并且该草图文件将具有唯一的文件哈希。我在想,是否有某种方法可以将字节计数、文件哈希或上次修改时间作为预处理器指令注入到理想的代码中。大概是这样的:

// pseudocode
const String SKETCH_FILE_HASH = #filehash;
const int SKETCH_FILE_SIZE = #filesize;
const int SKETCH_LAST_UPDATED = #modified;
但据我所知,这是我的看法。有没有办法为Arduino代码编写自定义预处理器指令或宏?特别是那些可以检查草图文件本身的文件?这可能吗?或者,是否已经存在某种方法以某种方式以编程方式跟踪更改?

冒着回答的风险

  • SKETCH\u FILE\u HASH
    :您必须在外部预计算并作为标志传递。我猜您正在使用arduino IDE,这是不可行的
  • 草图文件大小
    :答案相同
  • SKETCH\u LAST\u UPDATED
    :您可以使用
    \uuuuuu TIME\uuuu
    获取包含编译时间的字符串
考虑到政治委员会的部分,我会做什么

  • 嵌入链接到您的版本控制的关键字(例如,对于subversion,几乎所有VCS都提供此功能)
  • 嵌入编译时间
  • 将正式构建(软件团队控制的构建)更改为使用实际的工具链而不是IDE,并将其放在jenkins上:您将能够使用编译标志
嵌入一个代码,如

#ifndef BUILD_TYPE
  #define BUILD_TYPE "Unsupported"
#endif
在连续构建过程中,使用
-DBUILD\u TYPE=“HEAD”
“Release”


很抱歉,我没有看到魔法棒解决你的问题。我会投入大量资金进行培训,了解版本控制为什么可以拯救你(看来你已经有战争故事了)

我自己也在研究这个问题,发现:

这是为了查找引导加载程序;但我认为这样的东西可以用来确定整个代码的某种签名

我做了一个快速实验,添加了如下内容:

Serial.print("Other...");
Serial.println(CalculateChecksum(0, 2048));
在void setup()中,通过更改一小段代码(字符串),可以获得不同的CRC值

这不是一个明确的解决方案;我尝试了CalculateChecksum(032767)等等,如果我定义了一个整数,比如int a=101;并将其改为int a=102;校验和是一样的。只有当我更改字符串(即,添加空格)时,该值才会更改

我对Arduino的内存分配方式并不十分清楚;我知道有程序内存(32256字节)和全局变量内存(2048字节),所以我肯定有办法做到这一点

在另一个实验中,我使用了pgm_read_byte()函数,如果我创建了一个简单的内存转储函数:

void MemoryDump (word addr, word size) {
  word dataval = ~0;
  // prog_uint8_t* p = (prog_uint8_t*) addr;
  uint8_t* p = (uint8_t*) addr;
  for (word i = 0; i < size; ++i)
    {
    dataval = pgm_read_byte(p++);
    Serial.print(i);
    Serial.print(" ->");
    Serial.print(dataval,HEX);
    Serial.print(" ");
    Serial.print(dataval);
    Serial.print(" ");
    if(dataval>32)
    {
    Serial.print(char(dataval));
    }
    else
    {
    Serial.print("***");
    }
    Serial.print("\n");
    }
}
void MemoryDump(字地址、字大小){
单词dataval=~0;
//prog_uint8_t*p=(prog_uint8_t*)addr;
uint8_t*p=(uint8_t*)地址;
for(单词i=0;i”);
串行打印(数据值,十六进制);
连续打印(“”);
串行打印(dataval);
连续打印(“”);
如果(数据值>32)
{
串行打印(字符(数据值));
}
其他的
{
序列号。打印(“***”);
}
串行打印(“\n”);
}
}
。。。我写了一行,比如: Serial.println(F(“12345fghijklmnopqrstuvwxyz”)

因为F()将字符串放在程序内存中,所以您将在那里看到它

读取SRAM有点困难,如下所述:

我不是编译神,所以我不知道像a=101这样的东西;查找编译器/IDE,或者为什么这与程序内存区域没有不同

最后一点注意:


这些函数访问SRAM,所以也许,稍加调整,您可以在该内存上执行CRC,但这似乎有点问题,因为您必须使用变量进行计算。。。在SRAM中!但是如果代码是相同的,即使进行这样的计算,也有可能。再一次,我在这里陷入了困境,所以如果一个AVR神对此有异议,请用一个丑陋的事实来摧毁这个理论

你的素描用的是什么?是的。也就是说,软件开发人员是。但有时,不在软件开发团队中的人掌握了它,只是在本地进行更改。为什么不使用一种允许软件团队完全控制软件的策略:使用类似于拉请求系统的方法。任何人都不允许使用修改后的代码版本,除非它是“官方的”(即来自中央存储库),并且唯一可以访问该回购协议的团队是软件团队。如果有人想做一个改变,他必须提出请求并得到软件团队的接受。这样你就有机会了