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.

[参考译文] TMS320F2800157:TMS320F2800157:PIE RAM 奇偶校验测试

Guru**** 2511415 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1366958/tms320f2800157-tms320f2800157-pie-ram-parity-test

器件型号:TMS320F2800157
主题中讨论的其他器件:C2000WARE

工具与软件:

大家好、我正在尝试实施 PIE RAM 奇偶校验测试、我遵循了    sdl_ex_ram_ecc_chitate_test.cn 中的示例、但是我有一个问题、即虽然我遵循示例中提到的相同配置、但中断不会触发、我使用了 I2CA 中断(8.1)。

注:我注意到在 testRAMLogic 函数结束时(强制获取向量之后)、中断被设定、但是与  UNCHR 和   CPU 相关的标志没有被设定。

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

    有什么建议吗?

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

    当您说中断不运行时、您意味着压 VectErrorHandler (或者您在代码中调用等效处理程序的任何内容)不运行? 您是否已确保完全启用 I2CA 的中断、以确保获取可以通过?

    惠特尼

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

    你好,Whiteny

    是的、我是说 PieVectorHandler 不会运行、  

    我创建了以下函数:

    内联 Mg_vSetupPieVecErrHandler (void)
    {
     EALLOW
     CpuSysRegs.CPUSYSLOCK1.bit.PIEVERRADDR = 0
     CpuSysRegs.PIEVERRADDR.bit.ADDR =(UINT32)&Mg_PieVecErrHandler
     EDIS
    在执行测试之前调用函数、我希望调用该函数。
    ---
    关于中断、我按如下方式启用它:
    在清除所有 NMI 标志和状态寄存器后
    我使用以下命令启用全局中断:
     EALLOW
     NmiIntruptRegs.NMICFG.bit.NMIE = 1
     EDIS
    然后、在测试开始时、我按如下方式启用中断:
     /*启用 I2CA 中断*/
     EALLOW
     Dint
     PieCtrlRegs.PIEIER8.bit.INTx1 = 1U
     NmiIntruptRegs.NMICFG.bit.NMIE = 1U
     EINT
     EDIS
    为方便您参考、我使用的地址与示例中提到的地址相同: 0x00000DB0UL


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

    我看到您在 PIEIER 中启用了中断、但您是否也在 CPU IER 寄存器中启用了所需的中断组?

    惠特尼

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

    你好惠特尼

    感谢您的回答:
    我向代码中添加了 CPU IER 8并启用中断、如下所示:

     /*启用 I2CA 中断*/
     EALLOW
     Dint
     PieCtrlRegs.PIECTRL.bit.ENPIE = 1U/*启用 PIE */
     PieCtrlRegs.PIEIER8.bit.INTx1 = 1U
     NmiIntruptRegs.NMICFG.bit.NMIE = 1U
     IER |= M_INT8
     EINT
     EDIS
    中断出现、以及我在中断后运行软件时出现。  它将转到 strage 地址并提供以下消息:
    在地址"0xb0803"处中断、没有可用的调试信息、或在程序代码之外。
    鉴于我在中断结束时清除了针对中断组8的 PIEACK 位  
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    0xb0803不是此器件上的有效闪存、RAM 或 ROM 地址。 我有点惊讶,它说"地址中断",而不是让你登录你的非法指令处理程序。 返回地址似乎不正确。 您是否愿意共享 Mg_PieVecErrHandler 函数? 您是在上面使用__ interrupt 关键字、还是像我们在 SDL 示例中那样将其视为常规函数?

    惠特尼

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

    是的、我知道这是无效地址。 是的、我使用中断密钥字、它在其他组件中适用于我、我将其视为中断。  

    以下是  Mg_PieVecErrHandler 的示例:


    静态中断失效 Mg_PieVecErrHandler (void)
    {
    IntFlag = true;
    EALLOW;
    MemoryErrorRegs.UCERRCLR.bit.CPURDERR = 1;
    EDIS;
    PieCtrlRegs.PIEACK.ACK8 = 1;

    此外、我还将中断处理程序放在相应中断的矢量表中。

    那么,就我而言,我可以这样做吗? 或者、设置 CpuSysRegs.PIEVERRADDR.bit.ADDR 已经足够?

    例如:

     EALLOW
      CpuSysRegs.CPUSYSLOCK1.bit.PIEVERRADDR  =  0
     CpuSysRegs.PIEVERRADDR.bit.ADDR =(UINT32)&Mg_PieVecErrHandler
     PieVectTableI2CA_INT =&Mg_PieVecErrHandler
     EDIS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您删除了"interrupt"关键字、是否起作用? 我对示例 a 进行了实验,如果我在 PIE 向量错误处理程序中放入一个断点,然后单步执行函数的末尾,它实际上会在返回到应用程序之前返回到引导 ROM 中名为 CPU1BROM_压 矢量 mismatchHandler ()的函数。 CPU1BROM_piVectorMismatchHandler ()似乎是实际的中断,而 PIEVERRADDR 处理程序只是它所调用的函数。 您可以在下面的文件中看到代码:

    \libraries\boot_rom\f280015x\rev1\ROM_sources\F280015x_rom\bootROM\source\cpubrom_interrupts.c

    我想所发生的情况是、由于这两个函数都被声明为中断、因此这两个函数都具有编译器生成的中断上下文保存/恢复代码和返回指令。 ROM 处理程序认为用户处理程序是一个函数、所以它使用 LCR 指令来调用它、期望用户处理程序使用 LRETR 返回、但它使用的是 IRET、它会导致完全基于堆栈上的内容尝试返回到不正确的位置。

    您可以尝试在 ROM 中放入一个断点(CPU1BROM_piVectorMismatchHandler 位于0x3ffd000)、然后自行对其进行单步执行。

    惠特尼

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

    此外、我还将中断处理程序放在相应中断的矢量表中。

    那么,就我而言,我可以这样做吗? 或者、设置 CpuSysRegs.PIEVERRADDR.bit.ADDR 已经足够?

    例如:

     EALLOW
      CpuSysRegs.CPUSYSLOCK1.bit.PIEVERRADDR  =  0
     CpuSysRegs.PIEVERRADDR.bit.ADDR =(UINT32)&Mg_PieVecErrHandler
     PieVectTableI2CA_INT =&Mg_PieVecErrHandler
     EDIS
    [/报价]

    我认为将它们设置为不同的函数会更合理。 此测试旨在检查 PIE 矢量奇偶校验逻辑是否正常工作、因此如果您在实际的 I2CA_INT 中断处理程序中错误地结束、而不是在 PIEVERRADDR 函数中结束、这便是奇偶校验无法正常工作的标志。

    惠特尼

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

    惠特尼、您好!  

    谢谢您的回复、那么 您有哪些建议可以 解决此问题

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

    不要使用 Mg_PieVecErrHandler 的中断关键字。 它将 像一个常规函数一样被 CPU1BROM_piVectorMismatchHandler ()调用,因此应该被声明为一个常规函数,而不是一个中断。

    惠特尼

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

    谢谢惠特尼、我认为现在已经解决了。

    我还有一个问题与 CPUSYSLOCK1寄存器 PIEVERRADDR 位相关。 它已在代码中的某个位置被锁定、然后我再使用 PIE 处理程序的地址对其进行设置、我需要解锁以设置地址、然后再次锁定它、这是可能的吗? 或者我必须在测试前解除锁定?

    我看到这个部分、但不知道 CPU1.SYSRS 对应的是哪个寄存器

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

    SYSRS 是一种设备复位类型、因此基本而言、一旦锁定、只能通过系统复位来解锁。 您要么需要等待锁定寄存器、直到执行此测试、要么对测试和常规错误处理使用相同的处理函数-就像在函数中使用 if 语句检查它是否是实际错误、要么测试模式处于活动状态并相应地进行处理。

    惠特尼