应用程序有几个在极短的时间内按顺序发生的中断
(在 PWM 中断之后)。 我正在尝试分配与序列相匹配的中断子优先级
多个挂起中断时的事件数。
内部权限组集(NVIC_APINT_PRIGROUP_1_7);
这个 API 是否意味着这个组中的所有中断具有优先级1、有7个可能的子优先级?
这将适用于应用。
如何将中断标记为属于此组?
如何为这组中断分配子优先级?
谢谢、
Priya
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.
应用程序有几个在极短的时间内按顺序发生的中断
(在 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 中看到中断编号
是的、如果所有3个位被用于8个子优先级、所有中断将处于优先级组0中。 如果为组优先级分配了一个位、则级别 0x00、0x20、0x40和0x60位于组优先级0 (最高紧急性)、级别0x80、0xA0、0xC0和0xE0位于组优先级1 (较低紧急性)。 0x60级上的中断可以挤占0x80级(不同组级别)的中断例程、但是0x80级不能挤占0xA0级(相同组级别、不同子级别)。
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 进行"管理")和/或"已知"(最早到达的中断)可能"选择性地启用"特定的"后继"中断。 (实际上、每种情况都不同、但总的来说、这种方法"让我们"从"深入探讨中断子优先级!")
制定"单一解决方案"可能并不总是最优-"对其他计划方式/方法开放"- 定期启用/提供更多见解和优势...
如果调用 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的。