OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2511|回复: 7

请问这个函数是什么意思?

[复制链接]

41

主题

113

帖子

0

精华

高级会员

Rank: 4

积分
626
金钱
626
注册时间
2016-12-16
在线时间
222 小时
发表于 2017-9-15 11:26:25 | 显示全部楼层 |阅读模式
1金钱
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;
  }
  return(checksum == eeprom_get_char(source));
}

这个函数中的 checksum = (checksum << 1) || (checksum >> 7);
是什么意思,实现了什么算法。

最佳答案

查看完整内容[请看2#楼]

将eeprom起始地址source读取到destination开始的内存空间,读size个。 这个校验和是最后一个字节读出来跟自己计算的比较的。相等返回1,不相等返回0. 假如程序没贴错。 checksum = (checksum > 7) 每次读出一个字节后,校验和要么加1要么加0. 上次校验和全0才加0,其他都加1.
https://shop298719590.taobao.com/
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-9-15 11:26:26 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2017-9-15 16:49 编辑

将eeprom起始地址source读取到destination开始的内存空间,读size个。
这个校验和是最后一个字节读出来跟自己计算的比较的。相等返回1,不相等返回0.
假如程序没贴错。
checksum = (checksum << 1) || (checksum >> 7)
每次读出一个字节后,校验和要么加1要么加0.
上次校验和全0才加0,其他都加1.

小小蜗牛
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11552
金钱
11552
注册时间
2014-4-1
在线时间
1317 小时
发表于 2017-9-15 11:30:35 | 显示全部楼层

目测是把头移到尾巴上。


回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2017-9-15 16:01:45 | 显示全部楼层
本帖最后由 csmjmcc 于 2017-9-15 16:04 编辑

把checksum最高位BIT7放到最低位BIT0?不懂为何这样做,啥高级算法?保留进位?
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-9-15 16:08:57 | 显示全部楼层
他是逻辑或||,不是|。
小小蜗牛
回复

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-9-15 16:15:30 | 显示全部楼层
这个函数的功能是把EEPROM中的数据复制到一个数组中,在写入EEPROM之前把这组数据的校验和进行缩小,缩小成一个字节可以装得下,然后把这组数据连同其校验和一起写入EEPROM,在进行复制的时候,把数据和校验和从EEPROM中读出来,读出来的校验和按照缩小的比例放大,得到真实的校验和,然后比较校验和是不是相等,相等则读出数据无误,不相等读出数据有错误
坚持不懈的努力!
回复

使用道具 举报

41

主题

113

帖子

0

精华

高级会员

Rank: 4

积分
626
金钱
626
注册时间
2016-12-16
在线时间
222 小时
 楼主| 发表于 2017-9-18 15:44:31 | 显示全部楼层
非常感谢大家的回复,可是从回复中发现大家的C还不过关。
checksum = (checksum << 1) || (checksum >> 7);
这个值要么为1要么为0.
https://shop298719590.taobao.com/
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-19 00:14:10 | 显示全部楼层
五花肉老乌龟 发表于 2017-9-18 15:44
非常感谢大家的回复,可是从回复中发现大家的C还不过关。
checksum = (checksum > 7);
这个值要么为1要么 ...

1个位,能表示几个值?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 07:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表