从冗余副本恢复数据时,Em_EEPROM组件读取函数返回值不正确 – KBA227530 (ZH)
Author: LinglingG_46 Version: **
内容:
PSoC® 4, PSoC 5LP或者PSoC 6 MCU器件的PSoC Creator™ 4.2项目,使用Em_EEPROM组件V2_0,V2_10或者V2_20。
PSoC 6 MCU的带有psoc6sw-1.0或psoc6sw-1.1库的ModusToolbox™ IDE项目,使用模拟EEPROM中间件。
问题:
启用冗余副本并从冗余副本还原数据时,Em_EEPROM_Read()和Cy_Em_EEPROM_Read()函数还原Em_EEPROM中的数据,但结果返回值错误。第二次读取操作从Em_EEPROM返回正确的数据。
原因:
此问题是由指针算术中的错误引起的-对两个不同类型的操作数执行求和操作(uint32_t*和uint32_t), 这会导致不可预测的操作结果。
解决办法:
你可以使用以下方法解决问题:
1) 找到cy_em_eeprom.c文件并为其创建备份。根据PSoC系列和组件版本,此文件是位于下面的目录中:
PSoC Creator 4.2:PSoC 3, PSoC 4或者PSoC 5LP:
a. Em_EEPROM v2_10
C:\Users\<Username>\Documents\PSoC Creator\4.2\Downloads ( 4.2).cylib\Em_EEPROM_Dynamic_v2_10\API\cy_em_eeprom.c
b. Em_EEPROM v2_20
C:\Users\<Username>\Documents\PSoC Creator\4.2\Downloads ( 4.2).cylib\Em_EEPROM_Dynamic_v2_20\API\cy_em_eeprom.c
PSoC Creator 4.2和PSoC 6 MCU:
a. PDL 3.0.4
C:\Program Files (x86)\Cypress\PDL\3.0.4\middleware\em_eeprom\cy_em_eeprom.c
b. PDL 3.1.0
C:\Program Files (x86)\Cypress\PDL\3.1.0\middleware\em_eeprom\cy_em_eeprom.c
ModusToolbox和PSoC 6 MCU:
a. ModusToolbox v1.0
<user_home>\ModusToolbox_1.0\libraries\psoc6sw-1.0\components\psoc6mw\em_eeprom\cy_em_eeprom.c
b. ModusToolbox v1.1
<user_home>\ModusToolbox_1.1\libraries\psoc6sw-1.1\components\psoc6mw\em_eeprom\cy_em_eeprom.c
2) 更新cy_em_eeprom.c文件中的CheckCrcAndCopy()函数代码。
注意要为PSoC Creator和PSoC 6执行代码更新,请以管理员权限运行编辑器软件。
找到下面代码:
if(CY_EM_EEPROM_SUCCESS == ret) { (void)memcpy((void *)(dstAddr), (void *)(writeRamBuffer + rowOffset), numBytes); } ... |
用以下包含替代方法的代码替换上面的代码:
if(CY_EM_EEPROM_SUCCESS == ret) { (void)memcpy((void *)(dstAddr), (void *)((uint32_t)writeRamBuffer + rowOffset), numBytes); } ... |