Em_EEPROM コンポーネントのリード関数が無限ループにとどまってしまう問題 - KBA227502- Community Translated (JA)

Version 1

    Community Translated by MoTa_728816         Version: **

     

    Translation - English:  Em_EEPROM Component Read Function Stuck in Infinite Loop - KBA227502

     

    状況:

    PSoC® Creator™ 4.2 のプロジェクトで PSoC 3, PSoC 4, PSoC 5LP, PSoC 6 MCU デバイス用に Em_EEPROM コンポーネント v2_0, v2_10, V2_20 を 使用している場合。

     

    ModusToolbox™ IDE プロジェクトで PSoC 6 MCU 用の Emulated EEPROM ミドルウェアを使用する psoc6sw-1.0 または psoc6sw-1.1 ライブラリを使用しているもの。

     

    問題:

    Em_EEPROM コンポーネントが書込み処理をしているときに、想定外のリセットや電源喪失が発生した場合、Em_EEPROM_Read() や Cy_Em_EEPROM_Read() 関数を使用した処理が次の電源投入時に無限ループにとどまってしまう場合があります。

     

    原因:

    この問題はリード(Read)関数内のループの構成に起因します。無限ループが発生するのは不完全なフラッシュ書き込み処理によって、em_eeprom ヘッダーセクションのシーケンス番号 (変数 seqNum)が 0xFFFFFFFF に設定された場合に限られます。

     

    ワークアラウンド:

    以下のワークアラウンドを使用することによりこの問題を解決することが出来ます。

     

    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 ファイル内の Cy_Em_EEPROM_Read() 関数を下記のように変更してください。

     

    注意:PSoC 6 MCU 用のコードを変更する場合、エディタプログラムを管理者権限で実行する必要があります。

     

    下記のコードを特定してください:

     

            if((CY_EM_EEPROM_SUCCESS == ret) && (0u != seqNum))

            {

    numRowReads = (context->numberOfRows <= seqNum) ? (context->numberOfRows) : (seqNum);

    numRowReads--;

     

                for(i = (seqNum - numRowReads); i <= seqNum; i++)

                {

    startRowAddr = GetRowAddrBySeqNum(i, context);

     

                    if (0u != startRowAddr)

                    {

                        ...

     

     

    上記で見つけたコードをワークアラウンドを含む下記のコードと置き換えてください。

     

            if((CY_EM_EEPROM_SUCCESS == ret) && (0u != seqNum))

            {

    numRowReads = (context->numberOfRows <= seqNum) ? (context->numberOfRows) : (seqNum);

     

                for(i = 0; i < numRowReads; i++)

                {

    startRowAddr = GetRowAddrBySeqNum(seqNum - ((numRowReads - 1) - i), context);

     

                    if (0u != startRowAddr)

                    {

                        ...