2

特別なメモリ ブロックは、DMA タスクによって定期的に更新されます。別のタスクがこのブロック内のデータを頻繁に参照しようとした場合、L1 データ キャッシュのパリティ チェックに関する MCE (Machine Check Exception) が発生します。このメモリ ブロックの L1 データ キャッシュを完全に無効にすることはできますか? または DMA 更新後にのみ無効にすることはできますか?

libogc には次のような興味深い API があります。

void DCInvalidateRange(void *startaddress,u32 len); 

    .globl DCInvalidateRange
DCInvalidateRange:
    cmplwi r4, 0   # zero or negative size?
    blelr
    clrlwi. r5, r3, 27  # check for lower bits set in address
    beq 1f
    addi r4, r4, 0x20 
1:
    addi r4, r4, 0x1f
    srwi r4, r4, 5
    mtctr r4
2:
    dcbi r0, r3
    addi r3, r3, 0x20
    bdnz 2b
    blr

私は ASM にも PowerPC 上の ASM にも精通していません。人々はこの操作に関するリンクや説明を推奨しますか?

4

1 に答える 1

2

これが最高のリソース、PowerPCプログラミング環境マニュアルです

キャッシュについて具体的な質問はありますか?

DMAを使用する場合、選択肢はスヌーピングまたはキャッシュフラッシュです。このエラーが発生するには、スヌーピングが有効になっている可能性があります。したがって、問題は、初期化されていないデータがL1キャッシュにある可能性があります。

2番目のリソースであるE500コアリファレンスマニュアルがあります。これは現時点ではダウンロードできませんでしたが、キャッシュを初期化する方法についての適切な説明が記載されているはずです。私はいつもE-600の本を使っています。

于 2011-06-23T12:56:55.990 に答える