从冗余副本恢复数据时,Em_EEPROM组件读取函数返回值不正确 – KBA227530 (ZH)

Version 2

    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.0psoc6sw-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.2PSoC 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.2PSoC 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

     

    ModusToolboxPSoC 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 CreatorPSoC 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);

    }

            ...