注释
|
|| 是 OR 布尔运算的符号。2017-06-14 9:17 GMT+01:00 ericQiang <notifications@github.com>:
|
|
然后,在函数中: `int memcpy_from_eeprom_with_checksum(char *destination, unsigned int source, unsigned int size) {
} 最好的祝福。 |
|
这不是回答此类问题的编码论坛。您可以自己轻松地执行测试以了解其作用。如果您仍然认为存在潜在的错误,请发布一个新问题以提供一些证据。谢谢。 |
|
如果意图是通过旋转和添加来生成通用校验和,那它就是一个错误。布尔值或 (||)的结果为 |
|
@langwadt: 还需要证据。我真的没有时间去挖更多的兔子洞。这是自 Grbl 0.6 以来未更改的代码,因此它并不重要,因为它会在读取时生成相同的校验和(坏 == 坏)。如果存在错误(现在看来很可能),它是一个一致的错误,但它可以解释过去未能检测到 EEPROM 中的损坏数据。 在任何情况下,都无法发布修复程序,因为它会由于错误的校验和值而擦除所有现有的 EEPROM。一般来说,这不是一个好主意。它必须等到 v1.2 或下一个项目。与此同时,我仍然欢迎任何愿意对此进行测试并提供经过测试的解决方案的人。 |
|
@chamnit是的,如果没有一堆代码来处理更改,现在就无法更改它。
|
|
据我所知,该表达式已扩展为 int,因此如果左侧的 therm 产生假,|| 右侧的表达式 不能产生真实的。此外,布尔值或运算符将结果转换为 0 或 1 ,基本上 CRC 主要是最后一个字节 +1。我从 util/crc16.h 传递到 _crc8_ccitt_update,因为与校验和和 $# 偏移量相关的更新存在大量问题。Il 16/giu/2017 00:22 “langwadt” <notifications@github.com> ha scritto:
|
|
无论如何,这里存在风险。 |
|
FWIW,几个月前,我研究了更好的错误检查。我一直在计划对 ARM 版本中的非易失性数据使用 Fletcher 16 校验和,但这实际上取决于端口实现者。NVM 的东西在 HAL 的端口端。因此,您唯一可能看到此 EEPROM 代码的地方是 Mega2560 端口,它可能会在那里更新。 由于我上一篇文章中的原因,不要指望这会在 328p 版本上更新或更改。 |
|
非常感谢。^_^ |
|
真是笑话@chamnit. 有人在您的代码中看到了可能有问题的地方,并且您有勇气说“这不是一个回答此类问题的编码论坛”。 查看代码,很明显这段代码并没有按照您的想法进行,而且编写它的人也没有任何线索: checksum = (checksum << 1) || (checksum >> 7);
checksum += data;
你在这里试图做的是 8 位循环左移 1。但你不是。你只是向左移动 1。 所以你的代码只需要是: checksum = (checksum << 1);
checksum += data;
或者简化: checksum <<= 1;
checksum += data;
为什么?这是一个使用 8 位整数的逻辑比较,这意味着只有一个值 你的这个校验和算法等同于:
|
|
@bryc: 也祝你节日快乐!正如我之前所说,解决这个问题弊大于利,因为它会自动擦除使用已修复此固件的任何人的 EEPROM。无论如何,这个错误是相对良性的,并且在 2011 年我开始参与这个项目之前就已经存在了。最好在主要版本上解决它而不是增量版本。 |


int 文件 eeprom.c,第 144 行
checksum = (checksum << 1) || (checksum >> 7);如果或不是“||” 应该是“|”?
如果不是,这条线是什么意思?
谢谢。