13

Cortex-M3命令セットには、LDREX / STREX命令のファミリーがあり、場所がLDREX命令で読み取られた場合、次のSTREX命令は、アドレスが変更されていないことがわかっている場合にのみ、そのアドレスに書き込むことができます。通常、その効果は、LDREX以降に割り込み(ARM用語では「例外」)が発生していなければSTREXは成功しますが、それ以外の場合は失敗します。

Cortex M0でそのような動作をシミュレートする最も実用的な方法は何ですか?M3用のCコードを書いて、M0に移植できるようにしたいと思います。M3では、次のように言うことができます。

__inline void do_inc(unsigned int * dat)
{{
  while(__ strex(__ ldrex(dat)+1、dat)){}
}

アトミックインクリメントを実行します。Cortex-M0で同様の機能を実現するために私が考えることができる唯一の方法は、次のいずれかです。

  1. 「ldrex」で例外を無効にし、「strex」と「clrex」で例外を再度有効にします。ただし、すべての「ldrex」の直後に「strex」または「clrex」を続ける必要があります。
  2. 「ldrex」、「strex」、および「clrex」をRAM内の非常に小さなルーチンにし、「ldrex」の1つの命令を「strr1、[r2]」または「movr0、#1」にパッチします。「ldrex」ルーチンに「str」命令を「strex」ルーチンにプラグインさせ、「clrex」ルーチンに「mov r0、#1」をプラグインさせます。「ldrex」シーケンス呼び出し「clrex」を無効にする可能性のあるすべての例外があります。

ldrex / strex関数の使用方法によっては、割り込みを無効にすることは合理的に機能する可能性がありますが、「load-exclusive」のセマンティクスを変更して、それが放棄された場合に悪い副作用を引き起こすようにするのは厄介なようです。コードパッチのアイデアは、目的のセマンティクスを実現するように見えますが、不格好なようです。

(ところで、副次的な質問:M3のSTREXが単にフラグを設定するのではなく、成功/失敗の表示をレジスタに格納するのはなぜですか?実際の動作では、オペコードに4ビットの追加が必要であり、成功を保持するためにレジスタが使用可能である必要があります/ failure表示であり、成功したかどうかを判断するために「cmp r0、#0」を使用する必要があります。コンパイラーは、レジスターで結果を取得しなかった場合、STREX組み込み関数を適切に処理できないと予想されましたか。キャリーをレジスターに入れるには、2つの短い指示が必要です。)

4

4 に答える 4

6

うーん...まだ残っていますSWPが、それはそれほど強力ではないアトミック命令です。

ただし、割り込みの無効化は確実に機能します。:-)

編集:

-m0 に SWP がありません。

OK、あとは割り込みを無効にするだけのようです。無効にして適切に復元する方法のガイドとして、gcc コンパイル可能なインライン asm を使用できます: http://repo.or.cz/w/cbaos.git/blob/HEAD:/arch/arm-cortex-m0/include/ lock.h

于 2011-04-25T10:22:24.547 に答える
0

公式の ARM v6M 仕様では、HardFault 例外を致命的なものとして扱い、ハンドラー コンテキストを離れずにチップを保持またはリセットすることを強く推奨していますが、HardFault ハンドルで Cortex M0(+) コアの不足している命令をエミュレートしてから、フォールトした命令の後に戻ることができます。 .

m0FaultDispatch (ab)によって提供されるサンプル コードは、この機能を使用して、欠落している他の命令 (整数除算) をエミュレートします。非常に注意深く、チップ上の HardFault の考えられるすべての原因を把握していない限り、そのようなエミュレーションによって、他の有効な HardFault の原因が隠され、コードが未知の領域に進む可能性があります。

また、ARM v7M チップ上の LDREX/STREX に期待されるパフォーマンスに匹敵するエミュレーションはありません。

編集:相互排除モニターをエミュレートするには、他のすべての例外をMPUハンドラー(別名HardFault)、より通常の形式のトランポリンコードでラップするか、すべての割り込みハンドラーに明示的なサポートを追加する必要があります。

于 2022-01-03T16:21:45.267 に答える