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.

[参考译文] AM6422:如何使用 FreeRTOS 从 RTU 生成到 R5的中断

Guru**** 2642565 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1406006/am6422-how-to-generate-an-interrupt-from-rtu-to-r5-with-freertos

器件型号:AM6422
主题中讨论的其他器件:SysConfig

工具与软件:

您好、TI 专家 J ü、

我们已定制 RTU 固件并希望使用 FreeRTOS 生成从 RTU 到 R5的中断。 因此、我们不能将 syscfg 用作 MCU SDK R5示例。 有这样的示例吗  

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1225348/am6442-generating-an-interrupt-from-pru-to-r5f/4635548?tisearch=e2e-sitesearch&keymatch=pr0_pru_mst_intr%25255B15%25255D_intr_req#4635548:~:text=PRU%20code%20below,Fullscreen

在 RTU 端和 R5端?

此致

xixiguo

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

    您好!

    [报价 userid="206269" url="~/support/processors-group/processors/f/processors-forum/1406006/am6422-how-to-generate-an-interrupt-from-rtu-to-r5-with-freertos "]因此我们不能将 syscfg 用作 MCU SDK R5示例

    您能帮助我理解一下您的意思吗? 最好将 SysConfig 用于 INTC 映射、请参阅 用于 INTC 的 AM64x SysConfig

    除此之外、 上面连接的 E2E 中提到了从 PRU 生成到 R5F 中断的步骤、对于 RTU 也应遵循相同的步骤。 请尝试一下、如果您遇到任何问题、请告诉我。

    此致、

    Nitika

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

    嗨、Nitika、

    谢谢、我将尝试这样做并在此处更新结果。

    还有一个问题。 我们使用了 PRU GPI0-7、这意味着我们将定期读取寄存器 R31.b0 (位7-0)。 如果我们还定期写入 R31 (位3-0)以从 PRU 生成中断事件到 R5、它是否会影响 R31.b0的读取值?

    您能帮我理解您的意思吗? 最好使用 SysConfig 进行 INTC 映射、请参阅 AM64x SysConfig 进行 INTC[/QUOT]

    因为我们已经按照 https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/ 示例创建了旧版 PRU 工程。 我不知道如何在 CCS 开发环境和 Linux Yocto 开发环境中将旧的 PRU 项目与 R5 FreeRTOS 项目结合使用。 因此我要直接在 PRU 旧工程中将 PRU 中断的生成添加到 R5 FreeRTOS。

    此致

    xixiguo

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

    您好!

    因为我们已经创建了旧版 PRU 项目

    大家好、可以通过以下2种方法继续操作(适用于 CCS 环境和 FreeRTOS):

    1.首先是在 PRU 项目中添加所有必需的配置(如 TRM 第6.4.7.2节所述)。

    2. MCU+ SDK AM64x 有一个 example_pru_empty 示例、该示例是 PRU 工程和 R5F 工程的组合。 所有 PRU 代码都保留在 PRU 项目中、在构建 PRU 项目时会生成固件头文件、 默认情况下、这些文件包含在 R5F 项目中、包括选项。 R5F 工程是使用 SysConfig 文件构建的、并将  PRU 工程二进制文件加载到 PRU 内核上。
    您可以在此处将 PRU 代码移至 PRU 项目、并使用 SysConfig 进行部分必需配置。

     

    如果我们还定期写入 R31 (位3-0)以从 PRU 生成中断事件至 R5、它是否会影响 R31.b0的读取值?

    您必须确保您的操作是原子操作。 仅当 RTU 内核写入 R31寄存器时才会生成中断。 该值随后将被在 R31上接收的输入覆盖。

    您的设计看起来如何? 您是从 R31读取数据、然后生成中断、还是相反?

    您提到了 Linux 开发环境、如果您有任何 Linux 特定问题、我建议您创建一个新线程、以便将其分配给我们的 Linux PRU 专家。

    此致、

    Nitika

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

    嗨、Nitika、

    感谢您的答复。

    您的设计怎么样? 您是从 R31读取、然后生成中断还是相反?

    在我的设计中会有这样的情况:在写入 R31以生成一个中断事件到 R5之后、在 R5处理它之前、我们必须从 R31中读取 GPI。

    以及如何在这里理解、

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/783813/compiler-am6548-can-t-write-to-r31-of-pru#:~:text=Certainly%20you%20can,were%20you%20expecting%3F

    这是否意味着 R31写入中断事件不会影响 R31 GPI 的读取? 向 R31写入中断事件也不会受来自 R31的输入 GPI 的影响? 向 R31写入中断事件和从 R31 GPI 读取输入不会相互影响?

    此致

    xixiguo

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

    您好!

    以及如何在此处理解

    在本 E2E 中、它提到了您为生成中断而写入 R31的值将不会反映在应用程序和 CCS 调试器读取的值中。  原因是、一旦写入 R31、系统事件就会被触发、之后其值恢复到旧状态(这在同一 PRU 周期中发生、无额外延迟)。  

    我在终端上进行了测试、
    如果未映射输入信号、那么在您写入 R31后、它会变为0。
    如果启用输入信号、则它会更改为输入状态。

    此致、

    Nitika

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

    嗨、Nitika、

    如果未映射输入信号、在您写入 R31后、该信号将更改为0。
    如果启用了输入信号、则它将更改为输入状态。

    感谢您进行测试、这有助于我了解 R31。

    根据您的测试、我认为在我的例子中它应该起作用。 我稍后将在此处更新结果。

    此处是 E2E、

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1225348/am6442-generating-an-interrupt-from-pru-to-r5f/4635548?tisearch=e2e-sitesearch&keymatch=pr0_pru_mst_intr%25255B15%25255D_intr_req#4635548:~:text=I%20gutted%C2%A0%20/examples/motor_control/benchmark_demo/am64x%2Devm/r5fss0%2D0_nortos/main.c%20to%20create%20this%3A

    用于 R5 nortos。 对于 R5 FreeRTOS 有这样的示例吗?

    我的 R5 FreeRTOS 代码是指上面的 e2e、如下所示、

    #include <stdlib.h>
    #include <kernel/dpl/DebugP.h>
    #include "ti_drivers_config.h"
    #include "ti_board_config.h"
    #include "ti_drivers_open_close.h"
    #include "FreeRTOS.h"
    
    #include <drivers/pruicss.h>
    //#include <pru_ipc.h>
    
    volatile uint32_t intEvent      = 0UL;
    volatile uint32_t intCapt       = 0;
    volatile uint32_t intNum        = 0UL;
    HwiP_Params       hwiPrms;
    HwiP_Object       HwiObject;
    
    static void IsrFxn(void *args)
    {
        intNum = (uint32_t)args;
    
        intEvent++;
        intCapt++;
        HwiP_clearInt(intNum);
    }
    
    int pru_int(void)
    {
        
        uint32_t    intNum = 255;
        int32_t     retVal;
    
        DebugP_log("\r\nSTART INTC test App\r\n");
        HwiP_Params_init(&hwiPrms);
    
        DebugP_log("HWI START\n");
    
        hwiPrms.intNum   = intNum;
        hwiPrms.callback = IsrFxn;
        hwiPrms.args     = NULL;
    
        HwiP_init();
        DebugP_log("HWI init pass\n");
        retVal           = HwiP_construct(&HwiObject, &hwiPrms);
        DebugP_assert(retVal == SystemP_SUCCESS);
        DebugP_log("Interrupt 255 initialized\n");
    
        HwiP_enable();
        DebugP_log("HWI Enabled\n");
    
        /*while(1)
        {
            if(intCapt != 0)
            {
                intCapt = 0;
                DebugP_log("interrupt 255 received %d times\n", intEvent);
            }
        }*/
    
        return 0;
    }
    

    但它将被阻止在  Hwip_init()中、并且永远不会返回。  

    此致

    xixiguo

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

    您好!

    很抱歉响应延迟、我没有收到关于您的回复编辑的通知。  

    如果您正在寻找基于 FreeRTOS 的示例代码、我建议您使用位于" \examples\empty\am64x-evm\r5fss0-0_freertos'、并在其上面添加您的更改。

    此示例默认情况下将包含 FreeRTOS 工程所需的所有库。

    此致、

    Nitika

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

    嗨、Nitika、

    我尝试了空项目并添加了我的更改,这与  Hwip_init ()的块结果相同。 您能给我发电子邮件吗、我会把 R5项目发送给您吗?

    此致

    xixiguo

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

    您好!

    我已收到您的项目文件。 请允许我花一些时间来研究它并与您联系。

    此致、

    Nitika  

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

    嗨、Nitika、

    有任何关于此主题的更新吗? 我的文件是否有任何错误?

    此致

    xixiguo

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

    您好!

    谢谢您的 Ping。

    是的、在您的代码中、您在 empty.c 中调用 HWIP_init、因为 main.c 中的 System_init ()调用已经调用了 HWIP_init。

    您可以从 empty.c 中删除调用、然后继续您的实现。

    最好参考适用于您的用例的任何现有 FreeRTOS 项目、以确保您进行所有必需的函数调用。

    如果您遇到任何其他问题、请对该主题执行 ping 操作。   

    此致、

    Nitika

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

    嗨、Nitika、

    很抱歉回复迟到了、因为我们 上周是国庆假期。  

    移除函数  HWIP_init 后、R5工程可以运行。 但是、R5无法接收来自 ICSSG1_PRU0的中断。 我不确定我在 R5和 PRU0中定义的映射是否正确。 您可以帮助检查一下吗?

    BR

    xixiguohx

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

    您好!

    如前所述、在您的中断配置代码中可能仍需要进行一些更改。 让我们通过电子邮件继续调试您的代码。

    我将在下周初尝试对我的装置进行实施测试。

    此致、

    Nitika

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

    嗨、Nitika、

    感谢您在电子邮件中的回复和支持。

    最后、中断将在我这边正常工作、并更新我在这里所做的更改。

    我使用 AM64定制电路板、在 A53内核上运行 Linux、并通过 Remoteproc 加载 R5和 PRU 固件。

    我按照函数 PRUICSS_intcInit ()来检查 PRU 侧的配置,包括系统事件到通道、通道到主机中断映射、intr_in[x]和 host int enable (我使用的是 host int 9和 channel 9 )。 此后、当 PRU 固件启动并发送中断请求时、A53 Linux 发生内核严重错误、如下所示。

    [   51.103633] Unexpected kernel BRK exception at EL1
    [   51.103654] Internal error: BRK handler: 00000000f2000800 [#1] PREEMPT_RT SMP
    [   51.103670] Modules linked in: sch_mqprio rpmsg_ctrl rpmsg_char virtio_rpmsg_bus rpmsg_ns cdns3 cdns_usb_common irq_pruss_intc icssg_prueth pru_rproc icss_iep cdns3_ti ti_k3_r5_remoteproc pruss omap_mailbox
    [   51.103719] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 6.1.92-rt32 #1
    [   51.103728] Hardware name: customized based on Texas Instruments AM642 EVM (DT)
    [   51.103733] pstate: 200000c5 (nzCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    [   51.103742] pc : 0xffff800000825734
    [   51.103747] lr : 0xffff8000008256fc
    [   51.103750] sp : ffff800008003f90
    [   51.103753] x29: ffff800008003f90 x28: ffff800008b3a980 x27: ffff8000088b85c0
    [   51.103765] x26: ffff8000088b85c0 x25: 0000000000000000 x24: ffff00001cf9a2d8
    [   51.103777] x23: 0000000000000010 x22: ffff800008bf9290 x21: ffff000001fa5c60
    [   51.103787] x20: 0000000000000908 x19: ffff0000035b2880 x18: 0000000000000000
    [   51.103797] x17: ffff800014573000 x16: ffff800008000000 x15: 0000ffff97ffe4f0
    [   51.103808] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
    [   51.103818] x11: 0000000000000040 x10: ffff800008bbc040 x9 : ffff800008bbc018
    [   51.103828] x8 : ffff000000731268 x7 : 0000000000000000 x6 : 0000000000000000
    [   51.103838] x5 : ffff000000731240 x4 : ffff000000731380 x3 : 0000000000000000
    [   51.103848] x2 : 0000000000000000 x1 : 0000000000000000 x0 : 00000000ffffffea
    [   51.103860] Call trace:
    [   51.103864]  0xffff800000825734
    [   51.103868]  0xffff800008099e78
    [   51.103871]  0xffff80000838e39c
    [   51.103873]  0xffff800008015384
    [   51.103876]  0xffff800008015f28
    [   51.103879]  0xffff8000087d44d0
    [   51.103882]  0xffff8000087d4ad4
    [   51.103886]  0xffff8000080112e8
    [   51.103888]  0xffff8000087d54b4
    [   51.103891]  0xffff8000087e2bec
    [   51.103894]  0xffff800008083430
    [   51.103897]  0xffff800008083650
    [   51.103900]  0xffff8000087d58f8
    [   51.103903]  0xffff800008990688
    [   51.103906]  0xffff800008990bd4
    [   51.103909]  0xffff800008995a68
    [   51.103918] Code: a9425bf5 f9401bf7 a8c47bfd d65f03c0 (d4210000) 
    [   51.295028] ---[ end trace 0000000000000000 ]---
    [   51.295034] Kernel panic - not syncing: BRK handler: Fatal exception in interrupt
    [   51.307101] SMP: stopping secondary CPUs
    [   51.307119] Kernel Offset: disabled
    [   51.307122] CPU features: 0x00000,00800004,0000400b
    [   51.307129] Memory Limit: none
    [   51.322457] ---[ end Kernel panic - not syncing: BRK handler: Fatal exception in interrupt ]---

    要解决此问题、需要更改 HOST_INTR7连接。 默认情况下 不定义属性"ti,irqs-reserved"。 这意味着 所有 PRUSS INTC 输出中断2到9 (HOST_INTR0到 HOST_INTR7)都专门连接到 Arm 中断控制器。 因此、按如下所示定义"ti、irqs-reserved"、

    icssg1_intc: interrupt-controller@20000 {
    			compatible = "ti,icssg-intc";
    			reg = <0x20000 0x2000>;
    			interrupt-controller;
    			#interrupt-cells = <3>;
    			interrupts = <GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>,
    				     <GIC_SPI 217 IRQ_TYPE_LEVEL_HIGH>,
    				     <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>,
    				     <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>,
    				     <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>,
    				     <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>,
    				     <GIC_SPI 222 IRQ_TYPE_LEVEL_HIGH>;/*,
    				     <GIC_SPI 223 IRQ_TYPE_LEVEL_HIGH>;*/
    			interrupt-names = "host_intr0", "host_intr1",
    					  "host_intr2", "host_intr3",
    					  "host_intr4", "host_intr5",
    					  "host_intr6";/*, "host_intr7";*/
                ti,irqs-reserved =  /bits/ 8 <0x80>; /*BIT(7)*/
    		};

    然后不会发生内核严重问题、并且主机 INT9映射到 R5。

    R5侧应 正确清除 ICSS_INTC_STATUS_CLR_INDEX_REG、然后 R5可以成功地从 ICSSG1_PRU0接收中断。

    BR

    xixiguo