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.

[参考译文] TM4C1290NCPDT:分配中断子组优先级

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/874371/tm4c1290ncpdt-assigning-interrupt-sub-group-priorties

器件型号:TM4C1290NCPDT

应用程序有几个在极短的时间内按顺序发生的中断

(在 PWM 中断之后)。 我正在尝试分配与序列相匹配的中断子优先级

多个挂起中断时的事件数。  

内部权限组集(NVIC_APINT_PRIGROUP_1_7);

这个 API 是否意味着这个组中的所有中断具有优先级1、有7个可能的子优先级?

这将适用于应用。

如何将中断标记为属于此组?

如何为这组中断分配子优先级?

谢谢、

Priya

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

    如果您想更改处理挂起中断的默认顺序、但不允许它们抢占正在执行的中断例程、您可以更改 NVIC、使其具有单优先级、具有8个可能的子优先级。 我承认函数的使用令人困惑、但调用 IntPriorityGroupingSet (0)。 参数是优先级的位数。 它可以是0、1、2或3。 由于子优先级需要全部三个位、因此优先级需要0个位。

    使用函数 IntPrioritySet(),子优先级为0x00、0x20、0x40、0x60、0x80、 0xA0、0xC0或0xE0 (从最高紧急到最低紧急列出)。 还要记住、每个中断源都有自己的固有优先级、具体取决于中断编号。 当处于同一子优先级时、具有较低中断编号的中断将首先被服务。 您可以在 hw_ints.h 中看到中断编号

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

    Bob

    感谢你的答复。 组是否具有优先级? 如果使用8个子优先级、

    该组0的默认中断优先级是否为?

    如果我要使用一个位作为中断优先级(优先级= 1)、那么我是否分配

    0x40、0x50、0x60、0x70写入定义的子优先级?

    对于4个子优先级,是否定义 IntPriorityGroupingSet(2)?  

    如果不是、还需要将其设置为什么?

    Priya

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

    是的、如果所有3个位被用于8个子优先级、所有中断将处于优先级组0中。 如果为组优先级分配了一个位、则级别 0x00、0x20、0x40和0x60位于组优先级0 (最高紧急性)、级别0x80、0xA0、0xC0和0xE0位于组优先级1 (较低紧急性)。 0x60级上的中断可以挤占0x80级(不同组级别)的中断例程、但是0x80级不能挤占0xA0级(相同组级别、不同子级别)。

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

    Bob、

    您能否解释为给定的组优先级设置子优先级?

    对于4个子优先级,是否设置 IntPriorityGroupingSet(2)?  

    再次感谢您、

    Priya

     

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

    TM4C 器件上有三个位可用于设置优先级。 它们是一个字节的三个最高有效位、因此有效优先级为  :0x00、0x20、0x40、0x60、0x80、 0xA0、0xC0或0xE0。 每个字节的三个最高有效位是0、1、2、3、4、 5、6或7。 现在,这些位确定组优先级还是子优先级取决于对  IntPriorityGroupingSet()的调用。 传递要用于组优先级的位数。 由于只有三个可用位、因此有效选项为0、1、2或3。 默认情况下、所有三个位都用于组优先级、没有子优先级。 以下是数据表第171页的表格、其中显示了组优先级和子优先级之间的权衡:

    现在回到您的问题。 如果调用  IntPriorityGroupingSet(2),则已为组优先级分配了2位。 这只为子优先级留下1个位。 这意味着您将有4个组(2^2)、每个组具有2个子优先级(2^1)。 如果需要4个子优先级,请使用  IntPriorityGroupingSet(1)。 为组优先级分配一个位(为2个组分配)、为子优先级分配2个位(为每个组分配四个子优先级)。

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

    鲍勃--

    请查看/更正以下内容:

    IntPriorityGroupingSet (0);

    IntPrioritySet (INT1、0x00);  
    IntPrioritySet (INT2、0x20);  
    IntPrioritySet (INT3、0x40);   
    IntPrioritySet (INT4、0x60);   

    这是我如何将4个中断分配给组优先级0的吗? 将这4个中断连接到此组的是什么?

    谢谢、

    Priya

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

    您好!

    在这条线程中、有许多耐心和"内部技术洞察"。   向供应商的 Bob 鼓掌、他们给出了这样的"持续和多层"回应。

    我的小型年轻团队提出了以下意见-旨在证明"对供应商代理的磨损更少(3次已响应):"

    • 海报"实验"通常可以提供见解和清晰度-甚至比等待"海报供应商"响应周期更快
    • 这种热情的"供应商援助"并不总是会到达一个家门口。   (通过实验进一步支持/推动"自我帮助"—从学生转向员工时—或推进"工作中"—以及"没有这样的技术帮助是"随时可用的"。)

    在打开的帖子中、有人指出:"应用程序有几个在极短的时间内按顺序发生的中断。"    有时、中断的"太快、太集中/太多到达"(可能)会反映"不充分和/或(甚至)不健全的程序设计"。   我们的团队发现、"进一步的程序检查和分析"可以 (两者)减少 此类中断及其(更宽松-即间隔)的发生和到达。     例如-我们的团队发现:几个中断可能是、"组合在一起、仅一个中断"(和/或通过单个 ISR 进行"管理")和/或"已知"(最早到达的中断)可能"选择性地启用"特定的"后继"中断。   (实际上、每种情况都不同、但总的来说、这种方法"让我们"从"深入探讨中断子优先级!")

    制定"单一解决方案"可能并不总是最优-"对其他计划方式/方法开放"- 定期启用/提供更多见解和优势...

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

    应用程序使用17个中断。 按照我对优先级分组的理解、我认为只有当应用程序使用8个或4个中断或更少中断时、它才起作用。  

    谢谢、

    Priya

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

    如果调用 IntPriorityGroupingSet(0),则将0位分配给组,将3位分配给子优先级。 这意味着所有中断都将在组0中。 让我们以 GPIO 端口中断为例。 从"inc\hw_ints.h"中、我们可以看到 GPIO 端口中断的固有优先级:

    #define INT_GPIOA_TM4C129 16. // GPIO 端口 A
    #define INT_GPIOB_TM4C129 17. // GPIO 端口 B
    #define INT_GPIOC_TM4C129 18 // GPIO 端口 C
    #define INT_GPIOD_TM4C129 19. // GPIO 端口 D
    #define INT_GPIOE_TM4C129 20. // GPIO 端口 E
    

    数字越低、中断就越紧急。 端口 A 具有最高的紧急性。 如果我们想要反转顺序、以便在所有四个端口 A-D 都处于等待状态并且我们希望先为端口 D 中断提供服务时、我们会将每个端口分配给不同的子优先级:

    IntPrioritySet (INT_GPIOA、0x60);
    IntPrioritySet (INT_GPIOB、0x40);
    IntPrioritySet (INT_GPIOC、 0x20);
    IntPrioritySet (INT_GPIOD、0x00); 

    现在、GPIOD 处于子优先级0、是四个中断中最紧急的一个。 默认情况下、所有中断都以组0开始。 因此、如果 GPIOE 中断以及其他四个中断都处于挂起状态、则 GPIOD 将首先被服务、因为它在组0、子优先级0和内部编号19中。 下一个将是 GPIOE、因为它在组0中、子优先级0 (默认情况下)和内在数20 (20 > 19)。 接下来是 GPIOC、因为它位于组0、子优先级1 (0x20 >> 5)和内在数18中。 接下来是 GPIOB、因为它在组0、子优先级2 (0x40 >> 5)和内在数17中。 最后是 GPIOA、因为它在组0、子优先级3 (0x60 >> 5)和内在数16中。

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

    的确、您没有足够的子优先级位来完全反转 TM4C129器件上129个中断源的顺序。 但请记住、每个中断源都有一个固有的优先级。 您可以选择硬件连接、以便利用固有的优先级。 例如、对于需要更紧急的中断、使用 GPIOA 引脚;对于需要较紧急的中断、使用 GPIOB。 然后、您可以将它们设置为相同的子优先级、并让内部中断编号确定最终优先级。

    请注意。 中断例程应该是短的。 您的中断响应时间对于所有中断不应如此重要、因此您必须指定每个源的优先级。 如果您必须有一个长中断例程、并且您还有其他对时间要求非常严格的中断、那么该长例程应该是可预 mp的。