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.

[参考译文] TMS320F280025:有关如何设置中断优先级的问题

Guru**** 2580605 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024932/tms320f280025-questions-about-how-to-set-the-interrupt-priority

器件型号:TMS320F280025

我设置了两个中断、CPU_Timer1中断100us、ADCA 中断50us。我没有配置中断优先级。我发现  CPU_Timer1中断 的优先级高于 ADCA 中断。但是、我希望 ADCA 中断的中断比 CPU_Timer1中断更高。我应该为实现中断目标添加什么代码。

ADCA 中断 ISR 函数:

_interrupt void adcA1ISR (void)

ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_NUMBER1);

if (TRUE =ADC_getInterruptOverflowStatus (ADCA_BASE、ADC_INT_NUMBER1))

ADC_clearInterruptOverflowStatus (ADCA_BASE、ADC_INT_NUMBER1);
ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_NUMBER1);

INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group1);

CPU_Timer1输入:

_interrupt void cpuTimer1ISR (void)

 INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group1);

我尝试根据演示代码"interrupt_ex2_sw_Prioritization "修改代码、调制代码如下:

ADCA 中断 ISR 函数:

_interrupt void adcA1ISR (void)

volatile uint16_t tempPIEIER = HWREGH (PIECTRL_BASE + PIE_O_IER1);
IER |= M_INT1;
IER &= MINT1;
HWREGH (PIECTRL_BASE + PIE_O_IER1)&= MG1_7;

INTERRUPT_clearACKGROUP (0xFFFFFFU);
_asm (" NOP");
EINT;

ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_NUMBER1);

if (TRUE =ADC_getInterruptOverflowStatus (ADCA_BASE、ADC_INT_NUMBER1))

ADC_clearInterruptOverflowStatus (ADCA_BASE、ADC_INT_NUMBER1);
ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_NUMBER1);

INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group1);

Dint;
HWREGH (PIECTRL_BASE + PIE_O_IER1)= tempPIEIER;

CPU_Timer1输入:

_interrupt void cpuTimer1ISR (void)

IER &= MINT13;
EINT;


INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group1);

Dint;

我犯了什么错误?如果您能帮助我修改代码、我将不胜感激?

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

    您好!

    感谢您的提问! 如果我理解正确、那么您希望 ADCA 中断的优先级高于 CPU Timer1、对吧?

    默认情况下实际上就是这样。 ADCA1中断是"PIE 组1"的一部分、实际上是 INT1线路。 唯一一个优先级高于这个组的中断是"复位"。

    CPU 定时器1中断位于"INT13"行。 整个 PIE 模块(意味着所有外设中断)的优先级高于 CPU 定时器1。

    请参阅技术参考手册(此处链接)中的"CPU 中断矢量"表、了解中断矢量及其优先级的完整列表。

    总之、您无需向中断例程添加任何 IER 修改。 实际上、您可以正常进入和退出两个 ISR。

    我希望这有助于(并简化)您的项目!

    此致!

    Vince

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

    非常感谢。你是对的。抱歉、我在理解中断优先级时出错了。这是因为我的 CPU 定时器中断中有一个余数操作、并且花费了太多的时间。所以 由于 Cputimer1中的应用程序很长、ADCA1中断的周期不稳定。所以、如果是这样 我想 让 ADCA1 中断来中断 CPU 定时器中断、以达到中断嵌套的目的。如何修改代码使  中断嵌套为真?

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

    您好!

    感谢后续行动! 这是您尝试执行的操作的意义。 我们在以下链接位置提供了有关此内容的很好的指南。 这将介绍将中断嵌套到彼此之间所需的所有步骤。

    https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html#example-code

    请注意、您可能比示例更容易获得时间、因为您不需要更改优先级、只允许嵌套。

    因此、它可能只需要 CPU 定时器中断:

    (1)在开始时保存 PIEIER 寄存器(可能为可选)

    (2)设置 IER |=###以允许 ADCA 的组运行

    (3)正常 ISR 代码

    (4)恢复 PIEIER 寄存器(可能是可选的)

    您不需要更改所描述的 PIEIER!

    此致、

    Vince

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

    尊敬的 Vince:

       我已经 在 CPUTimer1中断函数中添加了代码,中断嵌套似乎已被设置为 true。但是、我仍然有一些困惑。

       如果我中断 CPUTimer1中断、两个相邻 ADCA 中断之间的时间间隔接近5000、如下所示:

       

       

      如果我启用  CPUTimer1中断、但不让 ADCA 中断中断使 CPUTimer1中断、并且 CPUTimer1中的代码的成本约为38us、"xx_gap"表示两个相邻中断之间的时间间隔、"xx_gap2"表示中断中应用程序的时间成本。

       

         

        如果我启用 CPUTimer1中断并让 ADCA 中断能够中断 CPUTimer1、则时间间隔如下:

       

        

        中断嵌套似乎产生了效果、但两个 ADCA 中断函数之间的时间间隔几乎不准确、只有50us。CPUTimer1中断服务转向  ADCA 中断服务的进度是否需要一些时间?  

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

    您好!

    感谢后续行动!

    [引用 userid="492637" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024932/tms320f280025-questions-about-how-to-set-the-interrupt-priority/3798192 #3798192"]CPUTimer1中断服务转向  ADCA 中断服务的进度是否需要一些时间?  [/报价]

    是的、进入每个中断的时间需要一些时间、因此这可以是您看到的内容(尽管它看起来有点高)。 这可能会因等待状态存储器、 RPT 指令、多周期指令等是否存在流水线延迟而发生很大变化

    假设没有如上所述的延迟源、仅节省内部上下文的最小周期数最多可达到32个周期(考虑到最小14个周期+ 8个定点推入+ 10个浮点推入)。 在20MHz 频率下、每个上下文切换的最短时间为~1.6us。 这可能会更高、具体取决于我之前提到的项目、如等待状态存储器。

    当您的 ADC 中断嵌套在 CPU_Timer1中断内部时、它可能会在保存 CPU_Timer1项目时看到上下文切换时间。

    总之、问题的答案是上下文从 CPUTimer1切换到 ADCA 中断确实需要时间。

    此致、

    Vince