4

低電力実行モードでRAMからcコードを実行しています(したがって、割り込みは処理されません)。このモードは、コード シーケンスによって有効になります。

  • RAMにジャンプ
  • SIM
  • 内部フラッシュと電源レギュレータをオフにし、低速クロック ソース (LSE) に切り替えます。
  • WFEモード(低電力待機モード)でいくつかの作業を行います
  • 電源レギュレーターとフラッシュをオンにし、クロックソースを復元します
  • リム
  • ジャンプしてフラッシュ

したがって、正誤表に記載されている WFE 命令は問題ありません。この構成に問題があり、低電力待機モードで CPU ロックが永久に発生する可能性があります。

while nbit(TIM1_SR1,CC3IF) asm("wfe");

つまり、次のように分解されます。

000035    720252B602     BTJT      TIM1_SR1, #1, 0xB6
00003A    728F           WFE

タイマーからのイベントには確率的な性質があり、このコードは WFE 命令が実行された後に発生することを保証しません。

  • BTJT 命令は 2 サイクルで実行され、長さは 5 です。
  • 「フェッチ」状態が数サイクルで実行を一時停止するため、RAM から実行されるコードは連続していない可能性があります

私はマニュアル PM0044 を使用しており、26 ページにはかなりのテーブルが含まれています。

RAM からのコード実行例

コードの実行が 3 サイクルで停止するケースが 2 つあります。したがって、非同期ウェイクアップ イベントが BTJT 命令と WFE 命令の間で発生しないかどうかはわかりません。

厳密な論理シーケンス (チェック条件 > wfe > ウェイクアップ イベント) を確保する方法はありますか?

4

2 に答える 2

5

ロックアップの問題が前述の WFE エラッタによって引き起こされている場合は、「適切なアプリケーションのタイミング」を達成しようとするよりも簡単な解決策があるはずです。

STMicroelectronics が提供する正誤表には次のように記載されています。

次の 2 種類の障害が発生する可能性があります。

ケース 1:
WFE 命令がメモリ内の 32 ビット ワードの 2 MSB に配置されている場合、WFE 実行サイクルまたは再実行サイクル (ISR ハンドラから戻るとき) 中にイベントが発生すると、不正なコードが実行されます。 .

ケース 2:
WFE 実行サイクル中に発生する割り込み要求は、不正なコード実行につながります。これは、ISR ハンドラから戻る際の WFE 再実行サイクルにも有効です。

「低電力実行モードを使用しているため、割り込みは処理されません」と言うように、ケース2はあなたのケースには当てはまりません。WFE 命令中に割り込みが発生しない場合は、最初のケースで説明した失敗のみがロックアップの原因である可能性があります。

ケース 1 は、WFE 命令がメモリ内の 32 ビット ワード内の特定のアライメントにある場合にのみ適用されます。したがって、このように整列されたコードに WFE 命令が表示されないことを確認できれば、このエラーは発生しません。アセンブラが align ディレクティブをサポートしている場合は、それを使用してこれを実現できます。アセンブラが NOP を挿入しない場合は、おそらくラベルとジャンプとともに使用できます。ただし、エラッタの「専用の回避策」として、より簡単な解決策が示されています。

WFE 命令を次のように置き換えます。

     WFE
     JRA next
next:

これは、WFE 命令の後に 2 バイトの NOP を配置することで、障害を回避しているようです。私の推測では、失敗の結果、CPU は WFE 命令の直後の命令を実行せず、次の 32 ビット ワールドの開始時に命令 (存在する場合) まで 2 バイト先にスキップします。スキップされたスペースに 2 バイトの NOP を入れると、障害が発生するかどうかは問題になりません。

于 2016-04-04T21:26:06.623 に答える
1

OPが見つけた解決策:

私は正誤表を(Ross Ridge のおかげで)数回注意深く読みましたが、これが主なアイデアです。

一般的な解決策は、適切なアプリケーション タイミングによって、WFE 命令の実行中または再実行サイクル中に割り込み要求またはイベントが発生しないようにすることです。

于 2016-04-04T07:49:06.390 に答える