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.

[参考译文] TMS570LC4357:当前活动 ISR 的索引

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064537/tms570lc4357-index-of-currently-active-isr

器件型号:TMS570LC4357
主题中讨论的其他器件:SEGGER

您好!

我正在寻找一种解决方案或方法来获取当前运行的 ISR 的索引-就我已经检查过的情况 而言、使用 ISRINDEX 或 FIQINDEX 寄存器是不可能实现的、因为当处理活动 ISR 时、它们可能会被取代。

是否有任何解决方案?

最棒的

Grzegorz

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

    您好!

    当一个中断被处理时、偏移矢量(ISRINDEX 和 FIQINDEX)显示下一个最高挂起中断的索引、如果没有中断挂起、则显示0x0。 您可以在中断 ISR 中打印中断信息。  

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

    您好!

    我们如何检查当前处理的中断的索引?

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

    ISR 知道 VIM 表中它的索引号。 例如、 GIO 高电平中断位于 VIM 通道#9上。  

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

    我需要更通用的方法来找出当前服务中断的索引- 对于 SEGGER systemview API、这是必需的、在该 API 中、任何中断都有一个调用、该调用应告知 SEGGER API 哪个中断当前处于活动状态、以便可以记录中断。

    因此、我需要有一种通用方式(函数)、可以在任何 ISR 中调用、它将告诉我当前处于哪个中断中。 这在该 MCU 中是可行的吗?

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

    因为我仍在寻找解决方案。

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

    在读取模块的中断偏移寄存器或写入标志寄存器(例如 gioREG->OFF1、 canREG1->INT 和 rtiREG1->INTFLAG)后、ISRINDEX 被清除。  

      您可以在读取模块的中断偏移寄存器之前读取 ISRINDEX 寄存器。  

    void gioHighLevelInterrupt (void)

          uint32 index = vimREG->IRQINDEX;


          uint32 offset = gioREG->OFF1;

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

    这仍然不是我要找的。

    正如您提到的、ISRINDEX 报告最高挂起中断的索引、我想知道在当前 ISR 例程中我所处的 ISR。

    示例:

    void lowPrioIsr (void){

      //HighPrioIsr 正在挂起

      int isrIndex = WhereIAm();//报告 LowPrioIsr

    void HighPrioIsr (void){

      int isrIndex = WhereIAm();//reports HighPrioIsr 索引

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

    您好!

    另一种方法是手动获取 VIM 矢量表的索引:

    typedef enum _INT_Index

       ESM_High =0、

       RSVED1、

       RTI_COMP0、  //2

       RTI_COMP1、  //3

        ,。

        Gio_High、    //9

        (笑声)

    } intIndex_t

    #pragma CODE_STATE (gioHighLevelInterrupt、32)
    #pragma INTERRUPT (gioHighLevelInterrupt、IRQ)

    /* sourceId:gio_sourceId_011 */
    /* DesignId:GIO_DesignId_011 */
    /*要求:HL_SR35、HL_SR36 */
    void gioHighLevelInterrupt (void)

       uint32 offset = gioREG->OFF1;

       /*用户代码开始(14)*/

      intindex_t interrupt_index = GIO_HIGH;


       /*用户代码结束*/

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

    这也不会解决我们的问题。

    我们需要通过一个回调函数获取 ISR 索引、因此无需手动获取。 似乎该处理器中没有解决方案。