冗長コピーから復元したときのEm_EEPROM コンポーネント読み出し関数の誤データ返送 - KBA227530 - Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
Community Translated by YoOb_1790021 Version: **
Translation - English: Em_EEPROM Component Read Function Returns Incorrect Data when Restored from a Redundant Copy - KBA22...
内容:
PSoC® 3、PSoC 4、PSoC 5LP、または PSoC 6 MCUデバイス用の Em_EEPROM コンポーネント v2_0、v2_10 または v2_20 を用いた PSoC Creator™ 4.2 プロジェクト。
PSoC 6 MCUのエミュレートEEPROMミドルウェアを使用する psoc6sw-1.0 または psoc6sw-1.1 ライブラリを用いた ModusToolbox™ IDE プロジェクト。
問題:
冗長コピーが有効で、冗長コピーからデータが復元されると、Em_EEPROM_Read() および Cy_Em_EEPROM_Read() 関数は、Em_EEPROM にデータを復元しますが、結果として誤ったデータを返します。2番目の読み出し操作では、Em_EEPROM から正しいデータを返します。
原因:
この問題は、ポインタ演算のエラーが原因で発生します - 合算演算は、タイプの異なる2つのオペランド (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 MCU のコードを更新するには、管理者権限で編集ソフトウェアを実行してください。
次のコードを見つけてください。
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); } ... |