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.

[参考译文] EVMK2GX:生成 PRU 到 DSP 中断时出现问题(裸机)

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1287748/evmk2gx-problems-generating-a-pru-to-dsp-interrupt-bare-metal

器件型号:EVMK2GX

在我的 Linux 桌面上进行设置(通过 USB 连接至 K2GEVM 电路板)

Code Composer Studio 版本 12.5.0.00007  

处理器_sdk_rtos_k2g_6_03_00_106/

TI-PROCESSOR-SDK-LINUX-k2G-EVM-06.03.00.106

BIOS_6_76_03_01

pdk_k2g_1_0_16

我正在尝试从 PRU (任何 PRU、但在本例中具体为 PR0_PRU0)生成到 K2G SOC 上 DSP 的中断。

在这个简单的示例中、我使用 K2GEVM 作为目标创建了一个新项目。  我使用"Empty Project"(使用 main.c)模板创建了 ARM、DSP 和 PRU 项目。

我启动 K2G 目标配置(删除.gel 文件)、然后连接到 ARM 并加载 evmk2g_arm.gel 文件。

然后运行 Scripts->Generic Functions->Global Default Setup (脚本->通用功能->全局默认设置)以设置功耗/时钟等、以便连接 PRU 并加载代码。

我连接至 DSP、然后加载并运行该 DSP 代码。

#define EVTFLAG0 (0x01800000)


/**
* main.c
*/
int main (空)
{
  unsigned int oldEventFlags = 0;
   unsigned int newEventFlags = 0;
   INT 运行= 1;
   while (正在运行)
   {
      //查找事件标志0寄存器中的任何更改
      newEventFlags =*((unsigned int*) EVTFLAG0);
      if (oldEventFlags != newEventFlags)
      {
         oldEventFlags = newEventFlags;
      
   
   返回0;

我连接到 PRU、并加载并运行以下 PRU 代码:

Volatile register unsigned int __R31;

空延迟()
{
   Volatile unsigned long int i;
   对于(I=0;I< 0xFFFFFF;I++)
   {
      //延迟一个位
   

#define PRUSS_INTC_EISR_PRU_ICSS_0 (0x20AA0028)
#define PRUSS_INTC_HIEISR_PRU_ICSS_0 (0x20AA0034)

/**
* main.c
*/
int main (空)
{
   __R31 = 0x00;

   /*启用主机中断0 */
   *((unsigned int*) PRUSS_INTC_HIEISR_PRU_ICSS_0)= 0;

   //启用要通过 INTC 传播的系统事件
   *((unsigned int*) PRUSS_INTC_EISR_PRU_ICSS_0)= 0x10;

   INT 运行= 1;
   while (正在运行)
   {
      __R31 = 0x20;
      delay();
   

   返回0;

 EVTFLAG0寄存器似乎始终为0x08、我从未获得预期的 PRU 中断的事件标志。

K2G TRM (SPRUHY8I)、表6-37指示第4个事件是 PRU-ICSS_0主机中断0、因此我希望设置 EVTFLAG0中的位4。

我已尝试了__R31寄存器写入的低4位中从0到15的所有值。

我还尝试了 EISR 和 HIEISR 寄存器中的其他值、但尚未偶然发现任何值起作用、尽管我不清楚、如果需要设置这些值或默认值应该起作用的话。

如何获得(甚至有可能)从 PRU 到此器件上的 DSP 的中断?

-大卫

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

    David、您好!

    我们无法再支持适用于 K2G 器件的非 Linux 软件开发。 请参阅 本公告。

    同时、让我来联系我们的硬件团队、就下面的硬件问题发表意见。

    K2G TRM (SPRUHY8I)、表6-37指示第4个事件是 PRU-ICSS_0主机中断0、因此我希望设置 EVTFLAG0中的位4。

    我已尝试了__R31寄存器写入的低4位中从0到15的所有值。

    我还尝试了 EISR 和 HIEISR 寄存器中的其他值、但尚未偶然发现任何值起作用、尽管我不清楚、如果需要设置这些值或默认值应该起作用的话。

    [/报价]

    此致、

    建中市

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

    作为记录、这个问题实际上与 Linux 或非 Linux 支持无关。  我可以重新表述这个问题、说我在 DSP 和 PRU 上运行 Linux、当我对 PRU 上的 R31寄存器进行写入操作时、我无法在 DSP 上获得中断。  请提供帮助。  我想我的例子可以帮助解决具体问题。  或许硬件团队会有一些见解。  请不要忽略这一点、因为我说过裸机。  只是为了说明这个具体问题。

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

    您好, 建中

    感谢您分配。

    David、我正在审阅该问题、并在内部联系团队进行检查。

    此致、

    斯里尼瓦萨

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

    有任何更新吗?

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

    David、您好!  

    我已经在内部与专家进行了联系、但没有听到任何反馈、

    让我跟进最新情况。

    此致、

    斯里尼瓦萨

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

    有任何更新吗?

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

    David、您好!  

    我已经在内部与专家进行了联系、但没有听到任何反馈、

    我继续跟随。

    请注意、许多专家本周都不在办公室。

    此致、

    斯里尼瓦萨

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

    有任何更新吗?

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

    David、您好!  

    我已经在内部与专家进行了联系、但没有听到任何反馈、

    我继续跟随。

    抱歉、我目前没有任何可共享的输入。

    此致、

    斯里尼瓦萨

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

    有任何更新吗?

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

    David、您好!  

    我已经在内部与专家进行了沟通、并要求他调查此问题以提供支持。

    我正在等待他的答复。

    此致、

    斯里尼瓦萨

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

    已经5周了。  是否预计会在某个时间内得到回复?  您能告诉我、从现在开始、将是几天、几周还是几个月吗?

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

    David、您好!  

    谢谢你。

    我没有时间安排的答案。 我将与专家进行接洽、我的待办事项列表中列出了这些内容、并在内部遵循这些内容。

    此致、

    斯里尼瓦萨

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

    David、您好!  

    请参考我从专家处收到的信息。

    看看代码、它看起来是一个基本的配置问题。 HIEISR 应设置为1以启用主机中断0
    /*启用主机中断0 */
    *((unsigned int*) PRUSS_INTC_HIEISR_PRU_ICSS_0)= 0;

    请告诉我这是否有帮助。

    此致、

    斯里尼瓦萨

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

    我尝试了0x01、0x02、0x04、0x08、0x10、 0x20、0x40、0x80、0x100、0x200、 0x3FF、并且我没有看到在 DSP 中设置任何事件标志。

    我还尝试了 多次写入 PRUSS_INTC_HIEISR_PRU_ICSS_0、因为文档中显示"这将启用主机中断输出、或者在已启用时再次触发输出。"

    它未在 DSP 中设置任何事件标志。

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

    David、您好!  

    感谢您提供宝贵意见。

    让我内部检查并更新您的信息。

    此致、

    斯里尼瓦萨

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

    David:

     INTC 有多个步骤来获取从事件到主机中断输出。 下图显示了通过 INTC 的路线。 您还需要将事件映射到通道并将通道映射到主机中断。 某些设置可以通过索引(上部寄存器)或数组(下部设置)来完成。

    此处是用于设置 INTC 的代码片段。 您需要适应您的事件、通道和主机中断。  

    /*------- INTC 配置--------------------------------------------------------------- */
      // ICSS_G0的 SLV_IN_46 (110)由 GPIO 设置
      //需要路由到通道12以将其映射到任务管理器

      //为事件110触发配置类型边沿- INTC_TYPE_REG3中的位14
      HW_WR_REG32 (0x30020D8C0xffbfff);// 0xFFfBfff
      //在 INTC_ENABLE_SET_INDEX 寄存器中启用事件
      //HW_WR_REG16 (0x30020,028,110);

      //将事件110映射到路由到任务管理器的通道12 - CH_MAP_REG_27
      HW_WR_REG32 (0x3002046C0x000C0000);
      //启用事件110 - INTC_ENABLE_REG3中的位14
      HW_WR_REG32 (0x3002030C0x00004000);
      //启用 EVENT_STATUS 11 - INTC_ENABLE_STATUS_REG3中的位14
      HW_WR_REG32 (0x3002028C0x00004000);
      //将通道映射到主机中断。 通道12至主机12 - HINT_MAP_REG3
      HW_WR_REG32 (0x3002080C、0x0000000C);
      //启用 HINT 通道12 - ENABLE_HINT_REG0
      HW_WR_REG32 (0x300215000x00001000);
      //对所有提示进行全局启用- GLOBAL_ENABLE_HINT_REG
      HW_WR_REG32 (0x30020010、0x00000001);
    -托马斯

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

    感谢您的答复。  我不一定要尝试从特定事件转换为主机 中断-我只是想从 PRU 中断 DSP (主机)。
    上述代码似乎适用于66AK2G 器件、这些寄存器地址毫无意义。
    例如、TRM (spruhy81.pdf)中的表6-440意味着位3-0用于物理地址为0x20AA 040C 的 PRUSS_INTC_CMR_3 Reg 中的 CH_MAP_12。
    表6-524指示 可以在物理地址0x20AA 0D80处的 PRUSS_INTC_SITR0寄存器中配置边沿中断。

    我真的很想接受上面的注释或代码、并把它映射到66AK2G、  

    我曾尝试执行 表6.4.6.3 PRU-ICSS 中断控制器基本编程模型中的步骤、但尚不清楚这是用于 PRU 托管还是托管 PRU 中断、这非常令人困惑。

    PRUSS_INTC_GER 寄存器是否启用从主机(DSP)到 PRU 的全局主机中断?  我想从 PRU 转到主机(DSP)、

    是否有可能获得特定于我所使用器件的说明?  (66AK2Gx)

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

    是的。 该示例来自不同的 SoC (AM243x/AM64x)。 但是、INTC 块兼容、这意味着偏移地址正确。 为 需要修改基地址 。 从我提供的示例中可以看出、 基地址 0x3002 0000、在 K2G 上转换为0x20AA 000。 这里是我参考的器件的寄存器描述。 它是相同的寄存器、但基地址不同。

    我认为您仍需要遵循 INTC 路由和示例代码、并修改基地址、事件编号、通道和主机中断。

    对于 K2G、我建议:

    event 16 : pr0_pru_mst_intr[0]_intr_req - event programmed by PRU R31 bit 0 + bit 5 (enable) seee figure 6-34。 K2G TRM 的事件接口映射(R31)

    通道映射事件16至通道2

    主机中断映射通道2到主机中断2

    TRM 对于主机中断2的名称不一致。 它实际上

    来自 PRU-ICSS_0_HOST_INT0 PRU-ICSS_0主机中断0的 CIC 事件0

    因此在 ICSS 内部、主机中断2实际上映射到 CIC PRU-ICSS_0_HOST_INT0 PRU-ICSS_0。

    我希望这一点现在可以更清楚一些。 据我所知、如果要在 PRU 到 DSP 之间生成中断、就必须完成完整的 INTC 配置。

    -托马斯

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

    好的、我想我设法将其归结为这最少数量的配置、以使 PRU 到 DSP 的中断正常工作:

    Volatile register unsigned int __R31;

    空延迟()
    {
      Volatile unsigned long int i;
      对于(I=0;I< 0xFFFFFF;I++)
      {
        //延迟一个位
      }

    #define PRUSS_INTC_HIEISR_PRU_ICSS_0 (0x20AA0034)
    #define PRUSS_INTC_CMR_4 (0x20AA0410)
    #define PRUSS_INTC_ESR0 (0x20AA0300)
    #define PRUSS_INTC_HMR0 (0x20AA0800)
    #define PRUSS_INTC_GER (0x20AA0010)

    /**
    * main.c
    */
    int main (空)
    {
      *((unsigned int*) PRUSS_INTC_CMR_4)= 0x00000002;
       *((unsigned int*) PRUSS_INTC_ESR0)= 0x00010000;
       *((unsigned int*) PRUSS_INTC_HMR0)= 0x00020000;
       *((unsigned int*) PRUSS_INTC_HIEISR_PRU_ICSS_0)= 0x002;
       *((unsigned int*) PRUSS_INTC_GER)= 0x00000001;

       INT 运行= 1;
       while (正在运行)
       {
          __R31 = 0x20;
          delay();
       

       返回0;

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

    David、您好!  

    感谢您提供的意见、并感谢您 为进行所需的代码更改、测试和关闭线程而付出的努力。

    此致、

    斯里尼瓦萨  

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

    我发现有必要添加最后几个指令、以便获得第二个(或更多)中断正常工作。

    如果 PRU 想要使 DSP 中断多次、似乎必须设置和清除中断。

    #define PRUSS_INTC_SECR0 (0x20AA0280)

    while (正在运行)
    {
      __R31 = 0x20;
       *((unsigned int*) PRUSS_INTC_SECR0)= 0x00010000;
       delay();

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

    David、您好!  

    感谢您的意见和建议、感谢您的参与。

    此致、

    斯里尼瓦萨

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

    对  PRUSS_INTC_SECR0的写入可在 DSP (主机)内完成、在获得中断后、不需要由 PRU 来完成。

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

    Hallo David,

     校正中断通常在 ISR 中清除。 或者、可以使用 INTC_STATUS_CLR_INDEX_REG (偏移量0x24)。 在这里、它不是位字段、而是事件编号。

    Br、

     托马斯

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

    我最初试图通过 EVTCLR0寄存器(0180 0020h)从 DSP (在 ISR 中)清除事件、但这不起作用(它清除了该事件、但不允许来自 PRU 的进一步中断)。  我没想过尝试 CIC 寄存器之类的东西。  根据您的上述建议、我尝试了 CIC_STATUS_CLR_INDEX_REG。  读取 CIC_RAW_STATUS_REG0表示 PRU 中断会触发事件0和8 (0x01和0x100)。  因此、我尝试了将0和8写入  CIC_STATUS_CLR_INDEX_REG。  这不起作用(再次说明、它清除了事件、但不允许来自 PRU 的进一步中断)。  我认为 PRU 需要清除主机中断。  在这种情况下、主机(DSP)能够写入 PRU 寄存器、尤其是用于清除主机中断的寄存器、这是我唯一尝试过的功能似乎有效的寄存器。

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

    尊敬的 David:  

      很抱歉不够清楚。 我说的是 INTC 寄存器、而不是 CIC 寄存器:

    您应该能够使用上面的寄存器和您希望清除的事件编号来清除 INTC 中的中断。

    Br、

     托马斯

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

    可以确认。
    #define PRU_ICSS_0_INTC_PRUSS_INTC_SICR *(unsigned int*)(0x20AA0024)
    #define PRU_ICSS_1_INTC_PRUSS_INTC_SICR *(unsigned int*)(0x20AE0024)

    PRU_ICSS_0_INTC_PRUSS_INTC_SICR = 16;(在 PR0 ISR 中)

    PRU_ICSS_1_INTC_PRUSS_INTC_SICR = 16;(在 PR1 ISR 中)

    也能正常工作。

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

    很好、如果您对此器件有更多 PRU 问题、请告诉我。