3

メインループ コードと割り込みの間で情報をキューに入れるための FIFO を実装する必要がある TI DSP (TMS320F28235) があります。このキューの高速実行は非常に重要ですが、適切な操作も重要です。明示的な同期を行わずに FIFO を実装してうまくいくかどうか、またはそうでない場合は割り込みを無効にする必要があるかどうかはわかりません。

私はこのページを見つけて、ここの誰かがその適用性についてコメントできるかどうか疑問に思っていました.

4

2 に答える 2

3

あなたが見つけたページは、まさにあなたの状況に当てはまります。ワードの読み取りと書き込みがアトミックであることにのみ依存します。ロードとストアをサイレントに並べ替えるハードウェアに対して脆弱です。一方で、人間が知っている他のほぼすべての同期アルゴリズムも、その特定のクロックに対して脆弱です。

本格的なコンピューター考古学に興味がある場合は、CDC 6600 オペレーティング システムの循環バッファーの説明を掘り下げてください。CDC は当初、6600 の複数の物理プロセッサ間で通信するための技術を開発しました。

于 2010-01-07T19:30:56.967 に答える
1

新しい正確な情報

命令セットのリファレンスは、ここにあります。

ロックをエミュレートするには、割り込みを無効にすることがドキュメントで提案されています。

Example ; Make the operation ”VarC = VarA + VarB” atomic:
    DINT ; Disable interrupts (INTM = 1)
    MOVL ACC,@VarA ; ACC = VarA
    ADDL ACC,@VarB ; ACC = ACC + VarB
    MOVL @VarC,ACC ; Store result into VarC
    EINT ; Enable interrupts (INTM = 0)

-- アルゴリズムポインタ --

割り込みはメインループを先取りし、明らかにアトミック操作は存在しません。メインループは、ポップしている間、割り込みを無効にする必要があります。割り込みを無効にすることは、このコンテキストでロックを所有するようなものであるため、キューを連続したメモリとして、または slist の上に実装できます。前者は、ポップ時にメモリをメインループのスタックにコピーすることを意味しますが、これは遅くなる可能性があります-ただし、FIFO に十分なメモリがある場合は、ヒープから slist ノードを割り当てる必要はありません-つまり、メモリ管理の問題はありません. もちろん、slist ノードのサイズが均一であれば、メモリ管理の問題は発生しません。

したがって、ポップの場合は、割り込みを無効にして要素を削除する必要があります。完了したら、割り込みを再度有効にします。割り込みベクトルの場合は、通常どおりです (割り込みベクトルの処理中に割り込みを無効にする必要がある場合があります。これはコントローラーに依存します)。

于 2010-01-07T23:06:21.507 に答える