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.

[参考译文] RTOS/AM4378:PRU1有时无法从 PRU0读取数据

Guru**** 2614265 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/658665/rtos-am4378-pru1-sometimes-fails-to-read-data-from-pru0

器件型号:AM4378

工具/软件:TI-RTOS

您好!

我正在使用:

PROCESSOR_SDK_RTOS_AM437X_3_03_00_04
PRU-software-support-package
PRU-ICSS-HSR-PRP-DAN_01.00.02.00



ICSS0-PRU0中的共享数据地址为0x00000800、从 ICSS0-PRU1的角度来看为0x00002800;
共享数据还使用地址为0x54440800的 ARM 与 PRU0通信。

(共享数据= PRU0 RAM 中的数据)

与 PRU1一起访问 PRU0-数据(共享数据)时有时会遇到问题。

所有值均为零。
为什么?

我制作了某种信号量(共享数据中的整数)开关信号"在 while 循环中等待、直到其他 PRU1为您完成数据写入"。 这个问题可能是因为循环中的 PRU0访问数据、而 PRU1无法在同一周期访问数据?   

此致、Mare

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

    您是否曾尝试在 while 循环中添加一些延迟以解决问题? 我认为、由于 PRU0的持续访问、总线有可能被阻止。

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

    你好,Garrett!

    我在 while 中做了一些"nop"行。 很难确认解决方案、因为误差是随机的。
    请您在下面解释一下:

    1) 在.cfg 文件中:

    VAR 外设 Attrs ={
    键入:MMU.FirstLevelDesc_section,//段描述符
    TEX:1、
    可缓冲:false, //可缓冲- true
    可高速缓冲:false, //可缓存
    可共享:true, //可共享
    NoExecute:false, //不可执行
    }; 

    我将可缓冲性设置为 false。 如果可缓冲性= true、则意味着当 ARM 对 PRU 位置进行写入时、不 会立即写入数据。 对吧?
    那么、在我的例子中、buffable=false 是可以的?.. 因为当我需要向 PRU 发送内容时、我还使用中断向 PRU 发送数据已准备好读取的信号?

    2) 当 PRU 在其本地 RAM (PRU0数据 RAM)中的"共享数据"中写入一些数据并向 ARM 发出中断时、我就会发现这种情况。 ARM 读取数据和数据已损坏! 第一个结构(uint32_t)成员正确、其他结构成员处于预览状态。 为了使用 ARM 读取和写入 PRU0 RAM、 我使用 HW_RD_REG32_RAW 和 HW_WR_REG32_RAW 函数。  发生什么事了? PRU 是否还具有一些到其 RAM 的延迟/缓冲?

    P.S.  非常感谢您的帮助!

    此致、
    马里

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

    1)"可缓冲(B)、可缓存(C)和类型扩展(TEX)位名称继承自的早期版本
    架构。 这些名称不再能充分描述 B、C 和 TEX 位的功能。" 有关存储器区域属性的详细信息,请参阅《ARMRegistered架构参考手册》。 但是、设置 buffable=false 是可以的、如果 cacheable=false、则存储器定义为严格排序。

    2) 2)您是否在项目中定义了 MEM_BAR_DISABLE? hw_types.h 中的这些 HW_RD_REG32_RAW 和 HW_WR_REG32_RAW 函数具有屏障 ASM ("DSB")、如果您在项目中定义了 MEM_Bread_disable、则可以禁用该设置。

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

    Garrett、

    感谢您的"1.)"。

    关于"2.)":

    I CHECK 函数:

    静态内联 void hw_MEM_barrier (void)
    {
    #if (defined (__ARMv7)|| defined (__TI_ARM_V7__)
    #ifndef MEM_barrier 禁用
    asm (" DSB");
    #endif
    #endif
    } 

    未定义 MEM_BAR_DISABLE!
    也  缺少__ARMv7或__TI_ARM_V7__。 它们应该被定义...对吧?
    现在 DSB 指令被禁用。
    这在 PDK_AM437X_1_0_6中是默认设置、对吧?

    此致、Mare

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

    是的、应该在您的项目中定义宏__ARMv7。 它通常在 config.bld 中定义、或在驱动程序/应用程序的 make 文件中定义、而不是头文件本身。

    此致、
    Garrett