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 到 R5F 的中断

Guru**** 1952840 points
Other Parts Discussed in Thread: SYSCONFIG, SK-AM64B, AM5729, AM6442
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1225348/am6442-generating-an-interrupt-from-pru-to-r5f

器件型号:AM6442
主题中讨论的其他器件:SysConfigSK-AM64BAM5729

这似乎是一个很常见的问题。 我已经详细了解了这些信息、没有找到明确的答案。

TRM 表9-80列出了 ICSSG 的中断120-127和248-255;

中断输入线路                   中断 ID  源中断

R5FSS0_COR0_INTR_IN_120 PRU_ICSSG0_PR1_HOST_INTR_Pend_0             
R5FSS0_COR0_INTR_IN_121 PRU_ICSSG0_PR1_HOST_INTR_pend_1             
R5FSS0_COR0_INTR_IN_122            PRU_ICSSG0_PR1_HOST_INTR_pend_2
R5FSS0_COR0_INTR_IN_123           PRU_ICSSG0_PR1_HOST_INTR_pend_3
R5FSS0_COR0_INTR_IN_124           PRU_ICSSG0_PR1_HOST_INTR_pend_4
R5FSS0_COR0_INTR_IN_125           PRU_ICSSG0_PR1_HOST_INTR_pend_5
R5FSS0_COR0_INTR_IN_126 PRU_ICSSG0_PR1_HOST_INTR_PUT_6            
R5FSS0_COR0_INTR_IN_127 127           PRU_ICSSG0_PR1_HOST_INTR_PUT_7

R5FSS0_COR0_INTR_IN_248 PRU_ICSSG1_PR1_HOST_INTR_pend_0            
R5FSS0_COR0_INTR_IN_249 PRU_ICSSG1_PR1_HOST_INTR_pend_1            
R5FSS0_COR0_INTR_IN_250 250 PRU_ICSSG1_PR1_HOST_INTR_pend_2            
R5FSS0_COR0_INTR_IN_251 PRU_ICSSG1_PR1_HOST_INTR_pend_3            
R5FSS0_COR0_INTR_IN_252 PRU_ICSSG1_PR1_HOST_INTR_pend_4            
R5FSS0_COR0_INTR_IN_253 253 PRU_ICSSG1_PR1_HOST_INTR_pend_5            
R5FSS0_COR0_INTR_IN_254 PRU_ICSSG1_PR1_HOST_INTR_pend_6            
R5FSS0_COR0_INTR_IN_255 PRU_ICSSG1_PR1_HOST_INTR_pend_7            

似乎没有任何关于它们与 PRU 关系的交叉参考 _pru_mst_intr[15:0]_intr_req

有关产生 PRU 中断的信息写得很好且易于理解。 未清除在 R5F 内核上接收到中断。

从 mcu_plus_sdk_am64x_08_05_00_24中的信息和示例来看、使用 HwiP_xxx 接口似乎是正确的机制。

但我没有太多的运气。

我在 R5上的代码看起来是这样的。

HwiP_Object HwiObject      ;

HwiP_Params hwiPrms;     

Hwip_init();

HwiP_Params_init (&hwiPrms);
hwiPrms.intNum  = intNum;
hwiPrms.callback = IsrFxn;
hwiPrms.args    =(void *) intNum;
RetVal = HwiP_structure (&HwiObject、&hwiPrms);

非常感谢为这项工作提供任何帮助。 目前、我只是构建一个通用示例。

一旦我解决了这一问题,我很乐意与社区分享这一问题。

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

    我使用暴力破解方法找到"有效"的基本 PRU/R5文件集。 我确信我需要调整 PRU 代码才能使额外的通道正常运行。

    该代码基于两个示例:

    1.从 PRU 软件支持包

    examples/am64x/PRU_RPMsg_Echo_Interrupt1

    我建议使用 RPMsg 演示文件来创建这个:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>
    #include <pru_intc.h>
    #include "resource_table.h"
    #include "intc_map_1.h"
    volatile register uint32_t __R31;
    #define R5_INT_249_CHANNEL 0x02
    #define INT_ENABLE (1 << 5)
    /*
    * main.c
    */
    void main(void)
    {
    CT_INTC.ENABLE_SET_INDEX_REG_bit.ENABLE_SET_INDEX |= (1 << 2);
    CT_INTC.HINT_ENABLE_SET_INDEX_REG_bit.HINT_ENABLE_SET_INDEX |= (1 << 2);
    CT_INTC.GLOBAL_ENABLE_HINT_REG_bit.ENABLE_HINT_ANY = 1;
    while (1)
    {
    __R31 = INT_ENABLE|R5_INT_249_CHANNEL;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    2.来自 MCU_PLUS_SDK_am64x_08_05_00_24

    ./examples/motor_control/benchmark_demo/am64x-evm/r5fss0-0_nortos/ti-arm-clang

    我建议 使用/examples/motor_control/benchmark_demo/am64x-evm/r5fss0-0_nortos/main.c 来创建:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdlib.h>
    #include "ti_drivers_config.h"
    #include "ti_board_config.h"
    #include "ti_drivers_open_close.h"
    #include "benchmarkdemo.h"
    volatile uint32_t intEvent = 0UL;
    volatile uint32_t intCapt = 0;
    volatile uint32_t intNum = 0UL;
    HwiP_Object HwiObject;
    static void IsrFxn(void *args)
    {
    intNum = (uint32_t)args;
    intEvent++;
    intCapt++;
    HwiP_clearInt(intNum);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我不是很清楚的事情;

    用于在 PRU 中初始化以更改到 R5F 中断映射的寄存器。

    是 R5表中的寄存器范围9-80 120-127 (对于 PRU0)和248-255 (对于 PRU1)

    这些寄存器范围是否会映射到第6.4.7.1节所述的8个 PRU 事件通道2-9

    "主机中断2到9从 PRU_ICSSG 导出、并映射到器件级中断控制器。"

    我希望 TI 专家可以帮助我清理这些内容、并澄清 PRU 代码中的寄存器设置以及 R5代码。

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

    您好!

    1.

    用于在 PRU 中初始化以更改到 R5F 中断映射的寄存器。

    [/报价]

    从 AM64x TRM 6.4.5.2.2.2提供:

    同时将‘1"写入 PRU_R31_VEC_VALID (R31位5)并将0至15的通道号写入 PRU_R31_VEC[3:0](R31位3-0)会在相应 PRU_mst_intr[x]_intr_req INTC 系统事件的输出上生成脉冲。 ‘、写入‘100000'将在 PRK_PRU_mst_intr[0]_intr_req 上生成脉冲、写入‘100001将在 intr_PRU_mst_PRK[1]_intr_req 上生成脉冲、在写入‘101111"时将在 intr_PRU_mst_intr[15]_req 上生成脉冲、而不会在 系统生成任何脉冲。

    来自子系统中两个 PRU 内核的输出值将一起进行"或"运算。 输出通道0-15分别连接到 INTC 系统事件16-31。 这样、PRU 可通过写入自身的 R31寄存器来使某个系统事件16-31生效。 待发送信号的主机由系统中断到中断通道映射(可编程)决定。

    2.  

    是 R5表中的寄存器范围 :PRU0为9-80 120-127,PRU1为248-255

    中断 ID 120-127是指 ICSSG0中断、248-255是指 ICSSG1中断。

    3.  

    这些寄存器范围是否会映射到第6.4.7.1节所述的8个 PRU 事件通道2-9

    [/报价]

    主机中断2到9被导出到系统中断、并 通过 PRU_ICSSG0_PR1_HOST_INTR_pend_0与 PRU_ICSSG0_PR1_HOST_INTR_Pend_7相对应、并在 R5F0-0上的输入中断线路120-127上创建中断。

    此外、我 建议您使用 SysConfig 配置中断设置并利用现有 IPC API (AM64x MCU+ SDK:PRU IPC (TI.com))、从而简化开发。  

    您还可以参阅 SDK 中的 PRU-ADC 接口示例、它 使用 PRU IPC API 将样本从 PRU 传输到 R5F (到 TCM)。

    如果您有任何其他问题、请告诉我。

    此致、

    尼蒂卡

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

    在上面的 PRU 示例代码中、我将在 ICSSG1_PRU1上运行并触发 PRK_PRU_mst_intr[2]_intr_req。 这作为中断249进行接收、即   R5F0-0上的 R5FSS0_CORE0_INTR_IN_249 PRU_ICSSG1_PR1_HOST_INTR_pend_1。

    不清楚 PRK_PRU_mst_intr[ X ]_intr_req 映射到 PRU_ICSSG1_PR1_HOST_INTR_pend_ X

    我如何修改现有的示例代码来触发中断250 PRU_ICSSG1_PR1_HOST_INTR_pend_2?

    接收此中断的 R5F 代码似乎是正确的。 从理论上讲、我只需要更改 R5F 值、 intNum = 250;

    我需要在 PRU1_1代码中更改什么内容?

    具体而言;

    我要向这些寄存器写入什么值;

     CT_INTC.ENABLE_SET_INDEX_REG_BIT.ENABLE_SET_INDEX         
     CT_INTC.HIN_ENABLE_SET_ING_BIT.HIN_ENABLE_SET_INDEX

    哪个通道映射寄存器 CH_MAP_REG X 我要配置哪个 PRK_PRU_mst_intr[ X ]_intr_req、我会通过写入来触发中断吗?

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

    您好!

    intr_pru_mst_intr[x]_PRK_req 不会直接映射到 PRU_ICSSG1_PR1_HOST_INTR_pend_ 十.8.  prk_pru_mst_intr[0:15]_prk_req 信号分别映射到系统事件16-31 (类似地、  2-9  对应于 PRU_ICSSG1_PR1_HOST_INTR_pend_ 0-7  并在中断线路上创建中断 248-255 )。

    从此处开始、要发出信号的主机由系统中断到中断通道映射(可编程)以及中断通道到主机中断映射决定。

    1.  

    我要向这些寄存器写入什么值;

     CT_INTC.ENABLE_SET_INDEX_REG_BIT.ENABLE_SET_INDEX         
     CT_INTC.HIN_ENABLE_SET_ING_BIT.HIN_ENABLE_SET_INDEX

    [/报价]

    为了触发 中断250、 PRU_ICSSG1_PR1_HOST_INTR_pend_2、我们选择主机中断4和通道4 (建议将通道"x"映射到主机中断"x")并将上述寄存器中的第4位设置为如下所示:

    Fullscreen
    1
    2
    CT_INTC.ENABLE_SET_INDEX_REG_bit.ENABLE_SET_INDEX |= (1 << 4);
    CT_INTC.HINT_ENABLE_SET_INDEX_REG_bit.HINT_ENABLE_SET_INDEX |= (1 << 4);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    2.  

    哪个通道映射寄存器 CH_MAP_REG X 我要配置哪个 PRK_PRU_mst_intr[ X ]_intr_req 我会写入以触发中断吗?

    通道映射寄存器(CH_MAP_REGx、 x=0至39)定义每个中断的通道。 每4个中断包含一个寄存器、因此160个中断具有40个通道映射寄存器(请参阅 TRM 的表6-975)。 因此、 ch_map_REG4是系统事件16至19的通道映射寄存器(PRK_PRU_mst_intr[0-3]_intr_req)。

    要将中断信号  PRK_PRU_mst_intr[0]_intr_reg (系统事件16)映射到中断通道4、我们会在 上述寄存器的 ch_map_16位中写入0x4。

    从 PRU 生成中断:

    ‘1"写入 PRU_R31_VEC_VALID (R31位5)并将0至15的通道编号写入 PRU_R31_VEC[3:0](R31位3-0)会在相应 PRU_mst_intr[x]_intr_req INTC 系统事件的输出上生成脉冲。 写入‘100000'将在 PRK_PRU_mst_intr[0]_intr_req  (事件编号 16、来自 TRM 表6-522)上生成一个脉冲。   有关更多详细信息、请参阅 TRM 中的第6.4.5.2.2.2节。

    请告诉我、这是否对您的解决方案有所帮助。

    此致、

    尼蒂卡

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

    Nitika,

    感谢您的详尽解释。 但是、我已经尝试了此修改、没有获得中断。 我运行了一些更多的测试、发现 ICSSG1_PRU1的默认通电配置会  在 PRK_PRU_mst_intr[2]_intr_req 生效时触发中断249、即 PRU_ICSSG1_PR1_HOST_INTR_pend_1。

    即将(1 << 5)| 2)写入寄存器_R31。

    我正在使用 SK-AM64b 入门套件执行原型测试。 我使用了上面提到的示例程序。 我需要在四个 R5内核中的每个内核上可靠地触发单个中断。 因此、我将需要触发 R5上可用的8个中断中的4个中断中的任何一个。

    我正在使用 MCU_PLUS_SDK_am64x_08_05_00_24和 (PRU)软件支持包 v6.1.0

    我假设我对 PRU 配置有基本的误解。 还可能 R5 API 的使用是错误的。

    我们非常感谢您为这项工作提供的任何帮助。

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

    您好!

    R5F 代码似乎存在问题、PRU 端缺少一些配置。

    请允许我花点时间来介绍一下您的实施过程、接下来我将与您联系。

    此致、

    Nitika.

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

    我创建了此脚本、以便更轻松地为远程处理器启动、停止和查询跟踪文件。 除了不想执行所有额外的输入之外、可能会有所帮助。 它已从 am5729移植、可与 SK-am64b 入门套件上的 am6442配合使用

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

    文件附加失败。 此处为 Linux 脚本源代码

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    PROC=7
    usage()
    {
    printf "\nUsage: rp <args> \n\t stat - show remote processors status\n\t temp - show processor temps\n\t start <cpu#> - start remote processor\n\t stop <cpu#> - stop remote processor\n\t halt <cpu#> - suspend current processor (not supported on some procs)\n"
    }
    start()
    {
    local var="/sys/class/remoteproc/remoteproc$PROC/state"
    echo $var
    echo start > $var
    }
    stop()
    {
    local var="/sys/class/remoteproc/remoteproc$PROC/state"
    echo stop > $var
    }
    halt()
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    您好!

    感谢您的脚本、希望 它对其他人有所帮助。

    关于中断生成、在您的实现中缺少一些步骤。 TRM 列出了中断配置所需的步骤、如下所示:

    您可以在 mcu_plus_SDK_am64x\source\drivers\pruicss\g_v0中找到 PRUICSS_intcInit 函数中 实现的所有这些步骤、在 PRU ADC 示例(mcu_plus_SDK_am64x\examples\PRU_IO\ads127\ads127_example.c)中实现 API、以在 PRU 和 PRU 之间创建中断。

    上述实现使用 SysConfig 接口选择通道和主机中断、自动生成的文件 ti_driver_config.c 包含 上述功能使用的结构。

    您能否告诉我、您是否仍然面临生成 PRU 到 R5F 中断的问题?

    此致、

    Nitika.

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

    很抱歉这么晚才回复、您已离开国家/地区几周。 我找到了您指向的文件、并使用您提供的先前信息、我能够找出详细信息。 下面的 PRU 代码;

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdint.h>
    #include <stdio.h>
    #include <string.h>
    #include <pru_intc.h>
    #include "resource_table.h"
    #include "intc_map_1.h"
    volatile register uint32_t __R31;
    #define R5_INTR_248 2
    #define R5_INTR_249 3
    #define R5_INTR_250 4
    #define R5_INTR_251 5
    #define R5_INTR_252 6
    #define R5_INTR_253 7
    #define R5_INTR_254 8
    #define R5_INTR_255 9
    #define HOST_INT 2
    #define INT_ENABLE (1 << 5)
    void main(void)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    R5F 代码按预期工作、无需更改。 hwiPrms.intNum 参数只需要与 PRU 代码中选择的中断号匹配。

    例如

    hwiPrms.intNum = 248;

x 出现错误。请重试或与管理员联系。