C 我可以通过编程方式检测草图中的更改吗?
在工作中,我们有一个定期更改的Arduino草图。简而言之,它通过串行端口来回通信。在大多数情况下,我们的软件开发团队控制代码;但是,我们公司还有一些其他团队会在最后一刻定期对草图进行更改,以满足客户的特定需求 这显然是一个很大的问题,因为这意味着我们可能会在不同的地方部署不同版本的草图,而没有意识到这一点。我们的软件开发人员非常擅长使用源代码管理,但其他团队没有那么严格 提出的一个想法是硬编码版本号,以便某个串行命令通过报告预定义的版本号进行响应。然而,问题是,如果我们的其他团队决定进行其他更改,他们可能同样没有更新版本号的规则 显然,最好的解决方案是切断其他团队进行更新,但假设出于办公室政治原因,这是不可能的,我想知道是否有任何方法可以通过编程方式“反思”Arduino草图。显然,草图将占用一定数量的字节,并且该草图文件将具有唯一的文件哈希。我在想,是否有某种方法可以将字节计数、文件哈希或上次修改时间作为预处理器指令注入到理想的代码中。大概是这样的:C 我可以通过编程方式检测草图中的更改吗?,c,arduino,preprocessor-directive,C,Arduino,Preprocessor Directive,在工作中,我们有一个定期更改的Arduino草图。简而言之,它通过串行端口来回通信。在大多数情况下,我们的软件开发团队控制代码;但是,我们公司还有一些其他团队会在最后一刻定期对草图进行更改,以满足客户的特定需求 这显然是一个很大的问题,因为这意味着我们可能会在不同的地方部署不同版本的草图,而没有意识到这一点。我们的软件开发人员非常擅长使用源代码管理,但其他团队没有那么严格 提出的一个想法是硬编码版本号,以便某个串行命令通过报告预定义的版本号进行响应。然而,问题是,如果我们的其他团队决定进行其他更
// pseudocode
const String SKETCH_FILE_HASH = #filehash;
const int SKETCH_FILE_SIZE = #filesize;
const int SKETCH_LAST_UPDATED = #modified;
但据我所知,这是我的看法。有没有办法为Arduino代码编写自定义预处理器指令或宏?特别是那些可以检查草图文件本身的文件?这可能吗?或者,是否已经存在某种方法以某种方式以编程方式跟踪更改?冒着回答的风险
:您必须在外部预计算并作为标志传递。我猜您正在使用arduino IDE,这是不可行的SKETCH\u FILE\u HASH
:答案相同草图文件大小
:您可以使用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神对此有异议,请用一个丑陋的事实来摧毁这个理论 你的素描用的是什么?是的。也就是说,软件开发人员是。但有时,不在软件开发团队中的人掌握了它,只是在本地进行更改。为什么不使用一种允许软件团队完全控制软件的策略:使用类似于拉请求系统的方法。任何人都不允许使用修改后的代码版本,除非它是“官方的”(即来自中央存储库),并且唯一可以访问该回购协议的团队是软件团队。如果有人想做一个改变,他必须提出请求并得到软件团队的接受。这样你就有机会了