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.
这似乎是一个很常见的问题。 我已经详细了解了这些信息、没有找到明确的答案。
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 演示文件来创建这个:
#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; __delay_cycles(200000000*10); } }
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 来创建:
#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); } int main(void) { HwiP_Params hwiPrms; uint32_t intNum = 249; int32_t retVal; System_init(); Board_init(); Drivers_open(); DebugP_log("\r\nSTART INTC test App\r\n"); HwiP_init(); DebugP_log("HWI START\n"); hwiPrms.intNum = intNum; hwiPrms.callback = IsrFxn; hwiPrms.args = (void *)intNum; retVal = HwiP_construct(&HwiObject, &hwiPrms); DebugP_assert(retVal == SystemP_SUCCESS); DebugP_log("Interrupt 249 initialized\n"); HwiP_enable(); DebugP_log("HWI Enabled\n"); while(1) { if(intCapt != 0) { intCapt = 0; { DebugP_log("interrupt 249 received %d times\n", intEvent); } } } Drivers_close(); Board_deinit(); System_deinit(); return 0; }
我不是很清楚的事情;
用于在 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.
[/quote]这些寄存器范围是否会映射到第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)。
如果您有任何其他问题、请告诉我。
此致、
尼蒂卡
在上面的 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位设置为如下所示:
Fullscreen12CT_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);XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXCT_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);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 脚本源代码
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() { local var="/sys/class/remoteproc/remoteproc$PROC/state" echo halt > $var } stat() { for F in /sys/class/remoteproc/remoteproc* do printf '%s\t%s\t%s\n' `echo $F |cut -d'/' -f5 | tr -d '\n'` `cat $F/name |cut -d '.' -f2 |tr -d '\n'` `cat $F/state` done |sort -V | grep -vE 'tx|rt' } temp() { local ztype=`cat /sys/devices/virtual/thermal/thermal_zone0/type` local ztemp=`cat /sys/devices/virtual/thermal/thermal_zone0/temp` local val=$((ztemp/1000)) local frac=$((ztemp-(val*1000))) printf "%s\t %d.%d C\n" $ztype $val $frac ztype=`cat /sys/devices/virtual/thermal/thermal_zone1/type` ztemp=`cat /sys/devices/virtual/thermal/thermal_zone1/temp` local val=$((ztemp/1000)) local frac=$((ztemp-(val*1000))) printf "%s\t %d.%d\tC\n" $ztype $val $frac } trace() { local filename="/sys/kernel/debug/remoteproc/remoteproc$PROC/trace0" if sudo test -f $filename then sudo cat $filename else printf "no trace file found for remote processor %d\n" $PROC fi } PROC=$2 case "$1" in '-h') usage ;; '') usage ;; 'trace') if [[ $# -eq 2 ]] then trace else usage fi ;; 'stat') stat ;; 'start') if [[ $# -eq 2 ]] then start else usage fi ;; 'stop') if [[ $# -eq 2 ]] then stop else usage fi ;; 'temp') temp ;; 'halt') if [[ $# -eq 2 ]] then stop else usage fi ;; *) usage ;; esac
您好!
感谢您的脚本、希望 它对其他人有所帮助。
关于中断生成、在您的实现中缺少一些步骤。 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 代码;
#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) { // // set the interrupt polarity // // active high is the default (1); // events 2-9 are .POLARITY_66-73 // set to (0) for active low // CT_INTC.POLARITY_REG2_bit.POLARITY_XX = 0; // // set interrupt type (PULSE, LEVEL) // default (0) = LEVEL // set to 1 for PULSE // CT_INTC.TYPE_REG2_bit.TYPE_XX = 0; // // clear interrupt status register for intr # // CT_INTC.STATUS_CLR_INDEX_REG_bit.STATUS_CLR_INDEX = R5_INTR_255; // // enable desired intr # // CT_INTC.ENABLE_SET_INDEX_REG_bit.ENABLE_SET_INDEX = R5_INTR_255; CT_INTC.HINT_ENABLE_SET_INDEX_REG_bit.HINT_ENABLE_SET_INDEX = R5_INTR_255; // // map channel to host interrupt // CT_INTC.HINT_MAP_REG0_bit.HINT_MAP_3 = R5_INTR_255; // // map event to channel // CT_INTC.CH_MAP_REG4_bit.CH_MAP_16 = R5_INTR_255; // // enable global interrupts // CT_INTC.GLOBAL_ENABLE_HINT_REG_bit.ENABLE_HINT_ANY = 1; while (1) { __delay_cycles((uint32_t)(200000000UL*10UL)); __R31 = INT_ENABLE|HOST_INT; } }
R5F 代码按预期工作、无需更改。 hwiPrms.intNum 参数只需要与 PRU 代码中选择的中断号匹配。
例如
hwiPrms.intNum = 248;