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.

[参考译文] TMS320C6670:C66x:PCIe 完成延迟会发生什么情况?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/663949/tms320c6670-c66x-what-happens-on-pcie-completer-delay

器件型号:TMS320C6670

各位专家、您好!

我想要求对 PCIe 操作进行澄清。 在我们的设计中、我们通过 PCIe 链路将 C6670连接到 Spartan 6。 FPGA 中包含 DMA 引擎、我们用于将大量数据上传到 DSP 的 DDR3。 当这些传输与来自 DSP 的 PIO 读取请求混合时、我会看到一些可疑的错误行为。

假设代码中存在 PIO 读取请求、如 PCIe 数据空间内地址的解引用、该解引用会转换为类似 LDx 指令的内容。 据我了解、PCIe 子系统发出读取请求 TLP 并等待完成。 此时 DSP 会发生什么情况? 它是否会出现某种失速? 此时它是否接受任何中断?

现在想象一下、读取请求 TLP 被传输到 EP、但 EP 忙于传输大量 DMA 数据、并且完整的返回会显著延迟。 在本例中、DSP 会发生什么情况?

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    团队将收到通知。 他们将直接在此处发布反馈。

    BR
    Tsvetolin Shulev
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、我花了一些时间才找到原因。
    事实上,我不能确定是否完全延迟会有任何影响。 我发现、在某些情况下、FPGA 上的 PCIe 引擎损坏、正在事务接口上发出帧起始、并在没有相应帧结束信号的情况下锁定在该状态。 我敢肯定、这是对规范的严重违反、但我想知道 DSP 是否可以检测此类滥用并采取恢复操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    根据您的描述、PCIe 链路仍然有效、但 FGPA 侧锁定。 您可以查看 DSP 的 PCIe 用户指南第2.16节错误处理:2.16.2.2 PCI Express 基线错误处理和2.16.2.3 PCI Express 高级错误报告、您是否看到以下寄存器报告的任何错误?

    寄存器地址
    STATUS_COMMAND0x 21801004
    DEV_STAT_CTRL0x 21801078
    LINK_STAT_CTRL0x 21801080
    PCIe_CERR0x 21801110
    PCIe_UNCERR0x 21801104
    ROOT_ERR_ST0x 21801130

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

    您好 Eric、

    感谢您的建议。

    我已经查看了这些寄存器。 当 FPGA 锁定时、我看到了

    STATUS_COMMAND 0x21801004 0x00100546
    DEV_STAT_CTRL 0x21801078 0x0002281F NFATAL_ERR
    LINK_STAT_CTRL 0x21801080 0x30110008 DLL_ACTIVE
    PCIe_CERR 0x21801110 0x00000000
    PCIe_UNCERR 0x21801104 0x00004000 cmpl_TMOT_ST
    ROOT_ERR_ST 0x21801130 0x0000002C NFERR MULT_FNF ERR_FNF
    

    与正常运行相比、最后只有3个错误寄存器获得非零值、而前3个寄存器完全相同。

    最初、我的同事发现了该问题。 他注意到、在 FPGA 端由 DMA 引擎执行的一些较长的 DMA 传输过程中、即 FPGA 作为 EP 向 DSP 发送已发布的写入请求作为 RC、他发现 DSP 上的计时器中断丢失了事件。 我们追溯到 PCIe 上有读取活动、即 DSP 向 FPGA 发送未过帐的读取请求、并等待完成者的到来。 所以我最初的猜测是、由于完成了等待、DSP 被挂起、不处理中断请求。 这是原始帖子的问题、我仍然想知道 DSP 正在读取存储器映射器件时会发生什么情况、但该读取需要更长的时间才能完成。

    使用一些简单的拐杖、我让完成者更快地返回、在那段时间内、我发现、实际上、SoF/EOF 序列也被打破。  

    我们正在使用仿真器将程序加载到 DSP、并在 CCS 中进行调试。 在第一次尝试时、它看起来缺少 MSI 中断、这是可以理解的、此时 SoF/EOF 序列中断。 但是、我们经常看到仿真被暂停、并且控制台中会出现以下消息:

    C66xx_0:读取长度
    为0x554的第0页上0x8dadd4处的存储器块时遇到问题:(错误-1060 @ 0x8DADF8)器件未响应请求。
    重置设备、然后重试此操作。 如果错误仍然存在、请确认
    配置、对电路板进行下电上电和/或尝试更可靠的 JTAG
    设置(例如、较低的 TCLK)。 (仿真包7.0.188.0) 

    它看起来是什么样的

    我在调试会话中无法再做任何其他事情。

    在 PCIe UG 中提到、PCIe 错误可用于触发中断。 但是、我将尝试这一点、但当仿真中断时、我似乎无法进行 Log_print。

    请您在上面推荐吗?

    谢谢。

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

    如果在发生计时器中断时需要更长时间进行回读、则从 DSP 到 FPGA 的 PCIe 读取请求是 CPU 读取。 我认为中断具有优先级、应该输入 ISR。 由于 PCIe 读取未返回(因此错过了 ISR)、ISR 是否对 PCIe 相关过程执行了任何操作、无法完成? 或者根本不会进入 ISR?

    "C66xx_0:读取长度第0页上0x8dadd4处的存储器块时出现问题
    0x554:(错误-1060 @ 0x8DADF8)设备未响应请求"=== >C6670 L2具有1MB,因此谁正在使用该区域、您的代码或某些数据? 您在 MSMC 中展示的屏幕截图显示了 PC 计数器、我不确定这两者之间的关系。

    从中断的角度来看、根据 PCIe 用户指南表2-10 PCIESS 中断事件、存在错误中断。 从 C6670数据表、48个 PCIExpress_ERR_INT 协议错误中断、此二级中断至 CIC。 您可以实现 PCIe ISR。

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

    您好 Eric、

    感谢您的持续帮助。

    根据、大多数程序代码驻留在 MSMCSRAM 中

    Program.sectMap[".text"] ="MSMCSRAM";
    Program.sectMap[".const"] ="MSMCSRAM";
    Program.sectMap[".qmss"] ="MSMCSRAM";
    Program.sectMap[".cppi"] ="MSMCSRAM";
    Program.sectMap[".fardata"] ="MSMCSRAM";
    Program.sectMap[".switch"] ="MSMCSRAM";
    Program.sectMap[".vecs"] ="MSMCSRAM";
    Program.sectMap[".cinit"] ="MSMCSRAM";
    Program.sectMap[".cio"] ="MSMCSRAM";
    Program.sectMap[".bss"] ="MSMCSRAM";
    Program.sectMap[".rodata"] ="MSMCSRAM";
    Program.sectMap[".neardata"]="MSMCSRAM";
    
    Program.sectMap["platform_lib"]="MSMCSRAM";
    
    Program.sectMap["SystemHeap"]="L2SRAM";
    Program.sectMap[".far"] ="L2SRAM";
    Program.sectMap[".stack"] ="L2SRAM";
    Program.sectMap[".localBuf"]="L2SRAM";
    Program.sectMap["tcp3DriverSection"]="L2SRAM";
    
    Program.sectMap["DataHeap"] ="DDR3";
    Program.sectMap["CalHeap"] ="DDR3";
    Program.sectMap[".Wavep"] ="DDR3";
    Program.sectMap[".capture_meas"]="DDR3"; 

    我不得不说,在每个场合,难以阅读的地点地址似乎都不同。 重要的是、除非关闭并重新打开调试会话、否则无法恢复调试。

    至于计时器 ISR 可能由于 PCIe 活动而锁定、这种情况并非如此。 在我的测试场景中、ISR 每156.25us 递增一次计数器、并在每四次运行中发布和 SWI、从而提供625秒的有效周期。请查看以下日志。

    我有一个计时器、每隔625秒触发一次并打印计数器。 我将 DMA 传输设置为由 FPGA 端的 DMA 引擎执行、并立即向 FPGA 发出四次读取请求。 完成这些读取请求会干扰 DMA 流、并最终中断 DMA 引擎。 这是我的问题、我希望解决它。 但是、我认为、当 DSP 处于存储器读取序列的中间时、它不会处理中断。

    时间、我们 日志消息 序列号
    4 760 130 MAIN ():FPGA 版本= 20170714:101、3、
    4 803 483 LTE_TIMER_PROCESSORT():CLK = 0x6edc、4、
    4 803 484 MAIN ():FPGA 版本= 20060000:0、 5、
    4 846 837 MAIN ():FPGA 版本= 20060000:0、 6、
    4 890 190 MAIN ():FPGA 版本= 20060000:0、 7、
    4 890 500 LTE_TIMERS_PROCESSORT():CLK = 0x6ee0、8、
    4 891 125 LTE_TIMERS_PROCESSORT():CLK = 0x6ee4、9、
    4 891 750 LTE_TIMERS_PROCESSORT():CLK = 0x6ee8、10、
    4 892 375 LTE_TIMER_PROCESSORT():CLK = 0x6eec、11、 

    在序列号3处、我们看到成功读取 FPGA 版本寄存器(值正确)。 下一行、seq#4是定时器 ISR 的输出、请注意它的时间是4 803 483 us。 接下来、对于未完成的读取请求、我们完成了3次、他们按照我描述的方式中断、这并不重要。 集会重要的是,在读取下列第5至6和6至7段之间有相当大的延迟,每段大约为40000 us。 更糟糕的是、发生计时器处理器 ISR、序列号4和8之间的时间差大约为90、000 us。 另外请注意、clk 计数器递增4、因此没有错过的序列号。 如果我们看下面的#8、9、10、当所有 PCIe 故障结束时、它们之间的差异恰好是625us。

    这让我认为、当存在未完成的存储器读取时、DSP 不能在该周期的中间中断。

    现在、我将进行推测。 我对中断序列的理解是、BIOS 正在保存可能受 ISR 执行影响的寄存器、然后在 ISR 完成时生成 ISR 和恢复寄存器。 想象一下、存在从 PCIe 或其他不可预测的外设到寄存器的存储器读取。 已发送读取请求、但尚未收到响应。 我想、DSP 在这种状态下正在停止、但我仅推测。 想象一下、中断请求发生在这个序列的中间。 外设尚未提供完整的功能、因此 BIOS 无法在产生 ISR 之前保存正确的值。 假设调用了 ISR、然后完成者到达-它将写入请求的寄存器、但它现在属于其他进程。

    请就此发表评论吗?

    同时、我正在尝试错误中断。 糟糕的是 PCIe 故障会导致仿真器断开连接、因此我无法看到 Log_prints。 我想尝试在 PCIe 子系统上重置、但在多次尝试中未成功。 我们计划重新启动 DSP 应用、需要重新启动 PCIe 链路。 从未成功过。 如果您有一些提示、这也是非常欢迎的。

    提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请评论、如果内存读取延迟、可能会出现什么问题。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Eric、
    我已成功设置次要事件处理。 为了确保它可以正常运行,我使用了 CpIntc_postSysInt( 0, 48);函数调用来触发 CIC0上的48 PCIExpress_ERR_INT。 我看到打印了相关消息。 但是、当我运行系统时、即使我看到0x21801104 PCIe_UNCHER 寄存器中的 ERROR 位已置位、也不会检测到该错误事件。
    您能不能建议、我还应该设置什么来捕获该错误。
    谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我们有一个将旧 INTA (50 PCIExpress_Legacy_INTA)例程到 CPU 的示例、请参阅代码 pdk_c667x_2_0_x\packages/ti\boot\examples\pci\ccieboot_interrupt\src、这与您的(48 PCIExpress_ERR_INT)类似。 请告诉我是否可以输入 ISR。

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

    您好 Eric、

    感谢您的建议、但似乎我需要一些其他的东西。

    我知道、如何在我的系统中使 MSI 功能正常工作时捕获 PCIe 中断、尽管 MSI 是主要事件。 最近、我终于掌握了考虑中的错误事件等次要事件的路由。 此外、我的 EDMA 事件路由方式类似、并且行为正常。 为了确保我手动触发系统事件-这是可以的。

    因此、我怀疑 PCIe 错误报告必须以某种方式启用或设置。 您将会喜欢指向正确的阅读或更好的示例。

    提前感谢。

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

    您好 Eric、

    我尝试查找相关设置、并得出以下结果:

    pcieRet_e setup_PCIe_error_intr (void)
    {
    pcieRet_e 评估;
    
    pcieRegisters_t setRegs;
    pciErrIrqEnableSetReg_t errIrqEnableSet;
    pcieRootErrCmdReg_t rootErrCmd;
    
    
    //清除所有寄存器结构
    memset (setRegs、 0、sizeof (setRegs) );
    memset(&errIrqEnableSet, 0, sizeof (errIrqEnableSet));
    memset( rootErrCmd,&) 0,sizeof (rootErrCmd) );
    
    errIrqEnableSet.errCor = 1;
    errIrqEnableSet.errFatal = 1;
    errIrqEnableSet.errNonFatal = 1;
    errIrqEnableSet.errSys = 1;
    
    setRegs.errIrqEnableSet =&errIrqEnableSet;
    
    rootErrCmd.ferrRptEn = 1;
    rootErrCmd.nferrRptEn = 1;
    
    setRegs.rootErrCmd = rootErrCmd (&H);
    
    if (PCIe_RET_OK!=(retval = PCIe_writeRegs (handle、PCIe_location_local、&setRegs)))
    {
    #if debug_errors
    system_printf ("setup_PCIe_error_intr:启用错误 IRQ 失败!\n");
    endif // debug_errors
    返回评估;
    }
    
    CpIntc_enableSysInt( CSL_CP_INTC_0、CSL_INTC0_PCIExpress_ERR_INT );
    
    返回 PCIe_RET_OK;
    } 

    我的配置中还包含以下内容:

    EventCombiner.eventGroupHwiNum[0]= 7;
    EventCombiner.eventGroupHwiNum[1]= 8;
    EventCombiner.eventGroupHwiNum[2]= 9;
    EventCombiner.eventGroupHwiNum[3]= 10;
    
    //*为 PCIe MSI 创建处理程序*/*
    
    请注意,事件 ID 17、18来自静态 corpecentive。 不要将
    *与 PCIESS 的 MSI 中断事件编号混淆。
    *在启用状态下为事件组合器隐式创建 Hwi。
    *我们将事件组合器回调设置为禁用状态、并将在
    中断设置例程中启用*。
    //
    EventCombiner.Events[17].fxn ='&PCIe_ISR';
    EventCombiner.Events[17].arg = 0;
    EventCombiner.Events[17].unmask = false;
    
    EventCombiner.Events[18].fxn ='&PCIe_ISR';
    EventCombiner.Events[18].arg = 4;
    EventCombiner.events[18].unmask = false;
    
    //由事件48触发的 Eth 接收的 ISR */
    EventCombiner.events[48].fxn =Ð Ω_Rx_ISR';
    CombEventiner.events[48].arg = 0;
    EventCombiner.events[48].unmask = false;
    
    
    
    //通过
    sysIntc.Cfn.C36]路由的系统事件 ='&EDMA_ISR';
    CpIntc.sysInts[36].arg = 36;
    CpIntc.sysInts[36].hostInt = 0;
    CpIntc.sysInts[36].enable = true;
    CpIntc.mapHostIntToEventCombinerMeta (CpIntc.sysInts[36].hostInt);
    
    // CIC0_OUT0事件56的 ISR */
    Combiner.Events[56].fxn = CpIntc.dispatch;
    EventEventInts.events[56].arg = CpIntn.sysInts.magle[56].sysn.events=CpInts.true.sysn.events.true.sysn.events=CpInts.r.sysn.events.true.events.true.sysn.sysn.events.true.sys
    
    
    ='&PCIe_err_ISR';
    CpIntc.sysInts[48].arg = 48;
    CpIntc.sysInts[48].hostInt = 1;
    CpIntc.sysInts[48].enable = true;
    CpIntc.mapHostIntToEventCombineMeta (CpIntc.sysInts[48].hostInt);
    /CpIntc.mapHostIntToHwimMeta (CpIntc.sysInts[48].hostInt、11);
    
    // CIC0_OUT1事件57 * ISR;CpIntEvents.combiner
    =
    
    真正事件57[48]. 

    我测试了 MSI 和 EDMA -它们按预期运行。 我已经尝试通过 CpIntc_postSysInt( 0, 48)触发系统事件;-它确实触发了所需的 ISR。

    在0x21801130 root_ERR_ST 中、我看到0x0000002C、即 NFERR | MULT_FNF | ERR_FNF、我看到0x21801104h PCIe_UNCERR 中的0x00004000。 但是、未触发 ISR。 如果您有任何想法、请提出建议。

    "Registers"视图:

    0x218011040x00000000
    0x218001c80x0000000F
    0x218001c40x00000000
    0x218001c00x00000000
    0x218010780x0000281F
    0x218011300x00000000
    0x218011080x00000000 0x00000000 0x2180112c
    0x00000006
    

    提前感谢。

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

    根据您的描述、系统中断设置正确。 在 PCIe 用户指南中、ERR 中断说明从3.1.72到3.1.75、我看到您设置了0x1c8、我想如果您发生了中断、您将看到0x1c0和0x1c4中设置的位。 即使您没有在0x1c8中设置任何内容、也应该在发生中断时看到0x1c0中设置的位(原始状态)。

    您可以手动插入0x1c0和0x1c4来设置位、然后应调用 PCIe ERR 中断 ISR。 这可以确认 PCIe ERR 中断设置。

    然后、您能否确认在实际系统中发生错误后、0x1c0和0x1c4都为零? 您如何知道是否发生了错误? 我看到0x1104为0 (因此没有发生解过程?)、为什么将112C 设置为0 (报告未启用)? 阅读《用户指南2.16可能更了解错过了什么。

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

    您好 Eric、

    感谢您的持续支持。

    首先、可能是 ROOT_ERR_CMD 有误读。 在寄存器读取的最后一行有0x2180112c 0x00000006、即我设置了位1和位2、对应于 FERR_RPT_EN、NFERR_RPT_EN、但不对应于 CERR_RPT_EN。 也不需要花费任何时间来启用它、但无论如何、我启用了致命/非致命错误报告、并且在0x21801130 root_ERR_ST 中、我看到了0x0000002C、即 NFERR | MULT_FNF | ERR_FNF。

    初始化时注册

    *(unsigned *) 0x21801104)unsigned int0x00000000 (Hex)0x21801104
    *(unsigned *) 0x21801c8)unsigned int0x0000000F (Hex)0x21801C8
    *(unsigned *) 0x21801C4)unsigned int0x00000000 (unsigned int 0x21801C108
    *(0x21801C08) unsigned
    Hex (0x21801C0) unsigned Hex (0x21801C108
    (0x21801C0)*(0x21801C0) unsigned Hex (0x21801C108
    )(0x21801C)*(0x21801C) unsigned Hex (0x21801C0) unsigned Hex (0x21801C) unsigned Hex (0x21801C)(0x21801C108)unsigned int0x00000007 (十六进制)0x2180112C
    *(unsigned *) 0x21801130)unsigned int0x00000000 (十六进制)0x21801130
    

    错误传输后的寄存器

    *(unsigned *) 0x21801104)unsigned int0x00004000 (Hex)0x21801104
    *(unsigned *) 0x21801c8)unsigned int0x0000000F (Hex)0x21801C8
    *(unsigned *) 0x21801C4)unsigned int0x00000000 (0x21801C108
    *(0x21801C08) unsignedHex
    (0x21801C0) unsigned Hex (0x21801C08)(0x21801C08)(0x21801C08) unsigned Hex (0x21801C08)*
    (0x21801C08
    ) unsigned Hex (0x21801C0) unsigned Hex (0x21801C08)(0x21801C08) unsigned Hex (0x21801C)(0x21801C)(0xunsigned int0x00000007 (十六进制)0x2180112C
    *(unsigned *) 0x21801130)unsigned int0x0000002C (十六进制)0x21801130
    

    我有0x21801c0 0x00000020、因此已经存在错误 ERR_AER - ECRC 错误原始状态。 但是、正如您所建议的、我手动将原始寄存器1C0和奇迹发生-错误 ISR 被触发! 我已确保1C8处的 ERR_IRQ_ENABLE_SET 为0xF、因此它应对 ERR_Corr ERR_Nonfatal ERR_fatal ERR_严重 ERR_SYS 做出反应。 可能还有一些需要设置的东西、但我已经迷路了。
    如果您有更好的想法、请提出建议。

    提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、我认为关键问题是1C4处的 ERR 中断启用状态寄存器(ERR_IRQ_STATUS)全部为零、尽管我尝试通过在1C8写入 ERR 中断启用设置寄存器(ERR_IRQ_ENABLE_SET)来启用中断。 不知怎么说、这没有影响...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这是我。 请考虑表3-1 KeyStone 架构的 PCI Express 应用寄存器外设组件互连 Express (PCIe)用户指南 SPRUGS6D—2013年9月。 有4个有趣的寄存器:

    1C0h ERR_IRQ_STATUS_RAW 原始 ERR 中断状态寄存器第3.1.72节
    1C4h ERR_IRQ_STATUS ERR 中断启用状态寄存器第3.1.73节
    1C8h ERR_IRQ_ENABLE_SET ERR 中断启用设置寄存器第3.1.74节
    1CCh ERR_IRQ_ENABLE_CLR ERR 中断启用清除寄存器第3.1.75节 

    据我了解、1C4h ERR_IRQ_STATUS 实际上是屏蔽寄存器、用于启用或禁用特定事件。 接下来、根据我的理解、该寄存器通过设置/清除寄存器对在1C8h ERR_IRQ_ENABLE_SET 和1CCh ERR_IRQ_ENABLE_CLR 处进行操作。 向前者写入1应启用事件、向后者写入-禁用。 但是、我看到的是、写入1C8h ERR_IRQ_ENABLE_SET 不会对1C4h ERR_IRQ_STATUS ERR 产生影响。

    初始状态:

    *(unsigned *) 0x218001c0)unsigned int0x00000000 (十六进制)0x218001C0
    *(unsigned *) 0x218001c4)unsigned int0x00000000 (十六进制)0x218001C4
    *(unsigned *) 0x218001c8)unsigned int0x00000000 (hex)0x18001C8
    *(0x1800218001C8)unsignedint (0x1800218001C8) unsigned int (十六进制)
    

    将0x3F 写入1C8h ERR_IRQ_ENABLE_SET:

    *(unsigned *) 0x218001c0)unsigned int0x00000000 (十六进制)0x218001C0
    *(unsigned *) 0x218001c4)unsigned int0x00000000 (十六进制)0x218001C4
    *(unsigned *) 0x218001c8)unsigned int 0x0000003F(十六
    进制) 0x1800218001C8 *(((((* 0x1800218001CC) 0x18001CC) 0x18001C8) unsigned 十六进制)
    

    将0x30写入1CCh ERR_IRQ_ENABLE_CLR

    *(unsigned *) 0x21801c0)unsigned int0x00000000 (十六进制)0x21801C0
    *(unsigned *) 0x21801c4)unsigned int0x00000000 (十六进制)0x21801C4
    *(unsigned *) 0x21801c8)unsigned int0x0000000F (hex)0x18001C8
    *(0x21801C8) unsignedint (0x18002CCx (hex)(0x18001C8)(0x21801C8) unsigned int)(十六进制)*(
    

    请注意、按预期设置/清除配对、但对1C4h ERR_IRQ_STATUS ERR 没有影响。

    请告知、我还能尝试什么。

    提前感谢。

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

    好的、最终帮助实现了在108-C 时在 ROOT_CTRL_CAP 中启用电源管理事件和系统错误。

    另一个观察结果是、1C4h ERR_IRQ_STATUS 不是"已启用"寄存器、如用户指南中所述。 我的观察结果是、每当我在1C0处手动点击 ERR_IRQ_STATUS_RAW 寄存器时、已启用的位会根据1C8中的掩码在1C4处生效。

    您能否澄清1C4h ERR_IRQ_STATUS 的含义和操作?

    我们在某种程度上放弃了原始问题、即当内核发出内存读取时会发生什么、但外设需要更长的时间来响应。 如果我在其他地方问这个问题、请告诉我。

    提前感谢。

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

    ERR_IRQ_ENABLE_SET 用于启用中断。
    ERR_IRQ_ENABLE_CLR 用于禁用中断。
    ERR_IRQ_STATUS_RAW 主要用于调试目的:即使您未设置 ERR_IRQ_ENABLE_SET、它也会在发生中断时设置该位
    ERR_IRQ_STATUS 会在发生中断且启用 ERR_IRQ_ENABLE_SET 时设置该位。 它还用于清除中断。

    感谢您找到用于启用中断的 ROOT_CTRL_CAP。 那么、我认为您现在可以使用错误中断了吗?

    当中断发生时、操作系统需要保存寄存器并在为 ISR 提供服务后恢复它们、以继续执行代码。 如果 PCIe 读取会长时间使 CPU 挂起、可能会出现一些问题、但我不确定会发生什么情况。 是否会错过 ISR 或处理 ISR、但保存了错误的寄存器、代码执行可能会变得奇怪?

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

    您好!

    您的解释非常有意义。 我的意思是 ERR_IRQ_STATUS 寄存器被称为 ERR 中断启用状态寄存器。 这种"启用"扭曲了我的想法。  

    是的、我现在运行了错误报告链。 到目前为止、我没有尝试任何恢复操作、但至少我有一些工具需要知道、PCIe 出现了问题。 这对我来说更重要。

    至于原始问题、我的观察结果是、只要存在未处理的读取请求、CPU 就会停止、死锁。 在 前面的帖子 中、我已经显示、计划间隔为156.25us 的计时器中断事件被延迟至大约40、000us、这接近默认值50ms、即我在手册中的某个位置看到的最长超时。 因此、我感觉 CPU 完全处于停滞状态、这让我认为、在时间关键型应用中读取 PCIe 是危险的。 我希望我错了。

    非常感谢您指导我完成本案例。 如果您可能对存储器读取延迟有其他注意事项、请分享。 之后、我将把这个线程标记为 Resolved。

    再次感谢。