2

DMA 任务会定期更新一个特殊的内存块。当另一个Task频繁尝试在这个block中查找数据时,会出现关于L1数据缓存奇偶校验的MCE(Machine Check Exception)。我可以完全或仅在 DMA 更新后使此内存块的 L1 数据缓存无效吗?

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 缓存中有未初始化的数据。

还有第二个资源,E500 核心参考手册,我目前无法下载,但它应该很好地描述了如何初始化缓存。我一直使用 E-600 书。

于 2011-06-23T12:56:55.990 回答