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.

[参考译文] PRU-SWPKG:在 PRU 之间共享变量

Guru**** 2553390 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/619957/pru-swpkg-sharing-variables-across-prus

器件型号:PRU-SWPKG

您好!

由于 PRUSS 0在 AM437x 上没有可用的显式 PRU 共享存储器、因此我尝试使用 PRU DMEM 在两个 PRU 内核之间共享变量。 我已在 C 文件(PRU0和 PRU1代码)中为 DATA_SECTION 添加了 pragma 指令、并在链接器文件中指定了该指令。 两个".map"文件显示变量的地址位置和空间相同、但我看不到变量正在更新。 我检查这一点的方法是、一旦 PRU1更新变量、PRU0就会闪烁 LED、但看起来它不起作用。

以下是相关章节:

PRU0.c 和 PRU1.c 中的 C 文件声明(两者相同):

#pragma DATA_SECTION (max_count、".max_count")
volatile far uint32_t max_count = 0; 

映射文件:


PRU0
.max_count
1            00002fe0   00000004    未初始化
                 00002fe0   00000004    PRU0.object (.max_count)
PRU1
.max_count
1            00002fe0   00000004    未初始化
                 00002fe0   00000004    PRU_pidSendData.object (.max_count)

我还附加了链接器文件。

e2e.ti.com/.../AM437x_5F00_PRU_5F00_SS0.txt




是否还有其他需要声明的内容?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    等待您的回复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Puneeth、

    请参阅第30.3.1.2节中表30-5中 AM437x TRM (www.ti.com/.../spruhl7)中 PRU 子系统的存储器映射。

    您将看到、PRU-ICSS0的 PRU0在地址0x0000访问其自身的本地存储器(PRU0 DRAM)、在地址0x2000访问 PRU1的本地存储器(PRU1 DRAM)。 首先、PRU1还会在0x0000处看到自己的本地存储器(PRU1 DRAM)(从其角度来看)、在0x2000处看到 PRU0的本地存储器(PRU0 DRAM)、这会让人感到困惑。

    所以:

    PRU0 -> PRU0 DRAM -> 0x0000

    PRU0 -> PRU1 DRAM -> 0x2000

    PRU1 -> PRU0 DRAM -> 0x2000

    PRU1 -> PRU1 DRAM -> 0x0000

    我认为在您的案例中、两个 PRU 在0x2FE0处使用相同的地址、这意味着 PRU0正在查看 PRU1的 DRAM、而 PRU1正在查看 PRU0的 DRAM。 因此、它们使用的存储器位置不同。

    您需要确定希望共享变量驻留的 DRAM (PRU0 DRAM 或 PRU1 DRAM)、然后需要具有非对称链接器文件、其中一个 PRU 位于0x0FE0、另一个 PRU 位于0x2FE0。

    Jason Reeder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、对于单个 uint32_t 变量来说、这完全没问题、但如果我尝试声明另一个变量、PRU 会突然停止。
    这就是我要做的:
    #pragma DATA_SECTION (count1、".count1")
    pragma RETAIN (count1)
    volatile far uint32_t count1;

    #pragma DATA_SECTION (count2、".count2")
    pragma RETAIN (count2)
    volatile far uint32_t count2;

    和 cmd 文件中
    SHAREDMEM1:org = 0x00000fe0 len = 0x00000008
    SHAREDMEM2:org = 0x00000fe8 len = 0x00000008
    ----------------------------------------------------
    SHAREDMEM1:org = 0x00002fe0 len = 0x00000008
    SHAREDMEM2:org = 0x00002fe8 len = 0x00000008
    (笑声)
    .count1>SHAREDMEM1、第1页
    .count2>SHAREDMEM2、第1页

    映射文件看起来也可以、但除非我在 其中一个 PRU 内核的代码中注释掉#DATA_SECTION、否则 PRU 会突然停止。
    我还尝试了其他方法、使用大小为2的数组从两个变量中创建结构、但它们似乎都不起作用。

    此致、
    Puneeth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、问题出在我的代码的其他部分。 i\我认为这是 uint8溢出或不正确的比较。
    不过,我只想确认我目前的做法是否是最好的做法。
    此外、是否有任何方法可以调试 PRU 代码? 目前、我依靠 LED 来查看事情是否达到特定点。 是否有更方便的方法?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、上述方法是在两个 PRU 内核之间共享变量的正确方法。

    调试 PRU 代码的最深入方法是将 JTAG 与 Code Composer Studio 一起使用。

    我经常使用的一种更轻的方法是让 PRU 将值写入存储器、然后在 Linux 中使用在 ARM 内核上运行的 devmem2实用程序来检查存储器中的值。

    在 PRU 上(以下地址应位于 PRU-ICSS0 PRU0的数据 RAM 中... 如果您愿意、也可以使用本地地址):
    #define debug *(volatile unsigned int *) 0x54440FD0
    DEBUG = 0xDEADBEEF;

    在 ARM 端子上:
    devmem2 0x54440FD0

    Jason Reeder