最新のCPU(ARMなど)を使用したサイクルカウント
多くのアプリケーションでは、命令実行が予想される入力刺激と既知のタイミング関係にあるCPUは、関係が不明である場合にはるかに高速なCPUを必要とするタスクを処理できます。たとえば、PSOCを使用してビデオを生成したプロジェクトでは、コードを使用して16 CPUクロックごとに1バイトのビデオデータを出力しました。SPIデバイスの準備ができており、分岐していない場合、IIRCは13クロックかかり、出力データへのロードとストアには11時間がかかるため、バイト間のデバイスの準備をテストする方法はありませんでした。代わりに、最初のバイトの後、各バイトに対して正確に16サイクルのコードをプロセッサに実行させるように単純に調整しました(実際のインデックス付きロード、ダミーインデックス付きロード、およびストアを使用したと思います)。ビデオの開始前に各行の最初のSPI書き込みが行われたため、後続の書き込みごとに、バッファオーバーランまたはアンダーランなしで書き込みが発生する可能性のある16サイクルのウィンドウがありました。分岐ループは不確実性の13サイクルウィンドウを生成しましたが、予測可能な16サイクルの実行により、後続のすべてのバイトの不確実性が同じ13サイクルウィンドウに収まることを意味しました(書き込みが許容できる16サイクルウィンドウ内に収まります)起こる)。 古いCPUの場合、命令のタイミング情報は明確で、利用可能で、明確でした。新しいARMの場合、タイミング情報ははるかに曖昧に見えます。コードがフラッシュから実行されている場合、キャッシュ動作により物事を予測するのがはるかに難しくなるため、サイクルカウントされたコードはすべてRAMから実行されると予想されます。ただし、RAMからコードを実行する場合でも、仕様は少しあいまいに見えます。サイクルカウントされたコードの使用はまだ良い考えですか?もしそうなら、それを確実に動作させるための最良のテクニックは何ですか?チップベンダーが、特定の場合に特定の命令の実行サイクルを削る「新しく改善された」チップを静かにすり抜けることはないと、どの程度安全に想定できますか? 次のループが単語の境界で開始すると仮定すると、仕様に基づいて正確にどれくらい時間がかかるかをどのように決定しますか? マイループ: mov r0、r0; より多くの命令をプリフェッチできるようにする短い単純な命令 mov r0、r0; より多くの命令をプリフェッチできるようにする短い単純な命令 mov r0、r0; より多くの命令をプリフェッチできるようにする短い単純な命令 mov r0、r0; より多くの命令をプリフェッチできるようにする短い単純な命令 mov r0、r0; より多くの命令をプリフェッチできるようにする短い単純な命令 mov r0、r0; より多くの命令をプリフェッチできるようにする短い単純な命令 r2、r1、#0x12000000を追加します。2ワード命令 ; 異なるオペランドを使用して、以下を繰り返します ; キャリーが発生するまで値を追加し続けます itcc addedcc r2、r2、#0x12000000; 2ワード命令、およびitccの追加の「ワード」 itcc addedcc r2、r2、#0x12000000; 2ワード命令、およびitccの追加の「ワード」 itcc addedcc r2、r2、#0x12000000; 2ワード命令、およびitccの追加の「ワード」 itcc addedcc r2、r2、#0x12000000; 2ワード命令、およびitccの追加の「ワード」 ; ... etc、より条件付きの2ワード命令 サブr8、r8、#1 bpl myloop …