Contact me: hankecnc@gmail.com

eeprom校验和错误? #1249

推推 grbl 3年前 (2023-01-23) 160次浏览

关闭
ericQiang 打开了这个问题 2017 年 6 月 14 日 · 12条评论
关闭

eeprom校验和错误?#1249

ericQiang 打开了这个问题 2017 年 6 月 14 日 · 12条评论

注释

eeprom校验和错误? #1249
强强 评论了 2017 年 6 月 14 日  

int 文件 eeprom.c,第 144 行

checksum = (checksum << 1) || (checksum >> 7);

如果或不是“||” 应该是“|”?
如果不是,这条线是什么意思?
谢谢。

eeprom校验和错误? #1249
X3ms蛇 评论了 2017 年 6 月 14 日 通过电子邮件
eeprom校验和错误? #1249
作者
强强 评论了 2017 年 6 月 14 日  

然后,在函数中:

`int memcpy_from_eeprom_with_checksum(char *destination, unsigned int source, unsigned int size) {
unsigned char data, checksum = 0;
for(; size > 0; size–) {
data = eeprom_get_char(source++);

checksum = (checksum << 1) || (checksum >> 7);

checksum += data;    

*(destination++) = data; 

}
返回(校验和 == eeprom_get_char(源));
}`
最后,校验和等于从函数 eeprom_get_char 返回的最后一个“数据”或等于最后一个“数据”+ 1 ???
是作者的本意吗?

最好的祝福。

eeprom校验和错误? #1249
成员

这不是回答此类问题的编码论坛。您可以自己轻松地执行测试以了解其作用。如果您仍然认为存在潜在的错误,请发布一个新问题以提供一些证据。谢谢。

eeprom校验和错误? #1249

如果意图是通过旋转和添加来生成通用校验和,那它就是一个错误。布尔值或 (||)的结果为
真或假 (1/0),要进行旋转,您需要按位或 (|) 或添加

eeprom校验和错误? #1249
成员

@langwadt: 还需要证据。我真的没有时间去挖更多的兔子洞。这是自 Grbl 0.6 以来未更改的代码,因此它并不重要,因为它会在读取时生成相同的校验和(坏 == 坏)。如果存在错误(现在看来很可能),它是一个一致的错误,但它可以解释过去未能检测到 EEPROM 中的损坏数据。

在任何情况下,都无法发布修复程序,因为它会由于错误的校验和值而擦除所有现有的 EEPROM。一般来说,这不是一个好主意。它必须等到 v1.2 或下一个项目。与此同时,我仍然欢迎任何愿意对此进行测试并提供经过测试的解决方案的人。

eeprom校验和错误? #1249

@chamnit是的,如果没有一堆代码来处理更改,现在就无法更改它。
使用 || 意味着校验和基本上是字节的总和,它可以工作但有弱点,使用 | 或 + 使它像这样:https ://en.wikipedia.org/wiki/BSD_checksum

llc@llc100:~$ cat checksumtest.c 
#include <stdio.h>
int main(void)
{
	unsigned char checksum = 0xab;
	unsigned char checksum1 = (checksum << 1) | (checksum >> 7);
	unsigned char checksum2 = (checksum << 1) || (checksum >> 7);
	printf("bitwise = 0x%x\n",checksum1);
	printf("boolean = 0x%x\n",checksum2);
}
llc@llc100:~$ gcc checksumtest.c 
llc@llc100:~$ ./a.out 
bitwise = 0x57
boolean = 0x1
llc@llc100:~$ 
eeprom校验和错误? #1249
危机 评论了 2017 年 6 月 16 日 通过电子邮件
eeprom校验和错误? #1249
作者
强强 评论了 2017 年 6 月 16 日  

无论如何,这里存在风险。
将“0xff”存储到 eeprom 将获得与“0xfe”相同的校验和。

eeprom校验和错误? #1249
成员

FWIW,几个月前,我研究了更好的错误检查。我一直在计划对 ARM 版本中的非易失性数据使用 Fletcher 16 校验和,但这实际上取决于端口实现者。NVM 的东西在 HAL 的端口端。因此,您唯一可能看到此 EEPROM 代码的地方是 Mega2560 端口,它可能会在那里更新。

由于我上一篇文章中的原因,不要指望这会在 328p 版本上更新或更改。

eeprom校验和错误? #1249
作者

非常感谢。^_^

eeprom校验和错误? #1249
布莱克 评论了 2019 年 12 月 26 日  

真是笑话@chamnit. 有人在您的代码中看到了可能有问题的地方,并且您有勇气说“这不是一个回答此类问题的编码论坛”。

查看代码,很明显这段代码并没有按照您的想法进行,而且编写它的人也没有任何线索:

    checksum = (checksum << 1) || (checksum >> 7);
    checksum += data;

你在这里试图做的是 8 位循环左移 1。但你不是。你只是向左移动 1。

所以你的代码只需要是:

    checksum = (checksum << 1);
    checksum += data;

或者简化:

    checksum <<= 1;
    checksum += data;

为什么?这是一个使用 8 位整数的逻辑比较,这意味着只有一个值0(或256溢出)才能产生FALSE条件。在那种情况下,0 >> 7它仍然是 0,它基本上是一个 NOP。它什么都不做。这是初学者级别的东西,你在像 grbl 这样的大项目中犯了错误……

你的这个校验和算法等同于:

  1. 使用 8 位类型从值 0 开始校验和unsigned char
  2. 将校验和乘以 2(左移一次)。
  3. 将下一个字节添加到校验和。
eeprom校验和错误? #1249
成员
香奈儿 评论了 2019 年 12 月 28 日  

@bryc: 也祝你节日快乐!正如我之前所说,解决这个问题弊大于利,因为它会自动擦除使用已修复此固件的任何人的 EEPROM。无论如何,这个错误是相对良性的,并且在 2011 年我开始参与这个项目之前就已经存在了。最好在主要版本上解决它而不是增量版本。

喜欢 (0)