This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6442:PRU-ICSSG对PRU DRAM进行原子写入

Guru**** 2551640 points
Other Parts Discussed in Thread: AM6442

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1094027/am6442-atomic-writes-by-pru-icssg-to-pru-dram

部件号:AM6442

我在GPEVM上使用AM6442和MCU+ SDK v 8.02 .00.31。

我在ICSSG1的PRU0上有一个程序,它每微秒增加一个32位计数器,并使用sbco指令将此计数器值写入PRU数据RAM,该指令的长度为4字节。

在R5F内核(裸机/无RTOS)上运行的第二个程序将从位于0x3008万的PRU数据RAM连续循环读取此计数器(未与PRU同步)。

R5F保留了一个MPU区域,将PRU数据RAM区域视为强序。

我注意到R5F读取的计数器值并非总是按预期增加。 我的意思是,每次PRU增加计数器时,它会增加1,但有时R5F读取的计数器会大量跳转(6.5536万等),然后返回到预期值。 因此R5F所看到的顺序值可能类似于1,2,3,4,5,6,765536,9,10,11。

如果R5F读取的值为“错误”,则它可以通过第二次立即读取PRU DRAM (0x3008万)来获得“正确”值。

32位PRU是否是原子写入(sbco指令一次写入4个字节)? 我假设如果PRU在R5F读取的同时写入,R5F可能会得到一个过时的值,但在PRU完成写入之前,我会看到不正确的数据。 这是预料之中的吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Steven,

    您是将递增值从PRU写入到相同的数据RAM位置,还是正在递增DRAM偏移量和写入量?

    这里还需要注意的是SBCO对PRU的说明是一种"火"和"忘却"。 在实际偏移处进行反射需要时间,但由于您使用数据RAM进行此操作,与其他内存区域相比,延迟会更短。  

    您能否提供您的申请,以便我能够更好地复制和评论。

    此致,

    Mohan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Mohan,很抱歉耽误您的时间,但我仍在汇总一些示例代码来演示此问题。 应该能够很快发布此信息。

    我们正在增加DRAM偏移量并以其他偏移量写入数据,但在PRU中的下一次循环更新期间返回到原始偏移量。 因此,在每个循环中,PRU都会写入同一DRAM部分,而R5F会不断轮询第一个寄存器,以确定其何时发生变化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Mohan,我们终于找到了这个。  我们的测试代码有一个错误,导致我们 偶尔从PRU一次写入2字节,而不是4字节。 由于 R5F读取与PRU是异步的,并且它一次读取4个字节,因此它偶尔会看到一个值,其中4个字节中只有2个是写入的。 我们将PRU测试代码更正为一次只写入4个字节,现在所有写入都显示为来自R5F的原子写入。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Steven,

    感谢您的确认。 如果您正在执行未对齐的内存访问,则可能会出现此类问题。 这说明了该行为。  

    此致,

    Mohan