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.
您好!
我正在使用两个中断源在 CM 内核上开发一个应用: SysTick 计时器和 UART。
SysTick IRQ 用于生成系统节拍、 UART IRQ 用于处理 EOT 事件。
我需要立即处理 UART IRQ、 最终嵌套 SysTick 处理程序执行。
执行此操作的最佳模式是什么? 我有一个简单的示例吗?
在 C28内核上、我会在 tick 处理程序例程内部重新启用中断、但在 ARM 内核上、我想有更好的方法来使用 NVIC"优先级组"属性来实现这一点。
谢谢!
Carlo。
我从未使用过 PriorityGrouping 函数、因为我从未有过需要。 读取 Interrupt_getPriorityGroup()时返回的值0似乎正常,该值意味着所有8个优先级(0...7)都在优先级组中,而不是在子组中。
请查看 TRM 中的表格:
在 CM 中实施 NVIC 可确保在 ARM 的全部256个可用优先级(8位)中、仅使用8个(3位)。 重要的是、这些是3个 MSB 位。 查看 NVIC_IPRx 寄存器-每个中断优先级寄存器部分中的低5位没有使用。
这就意味着、在 PRIGROUP 域中、当你将值设置为0到4时、效果是一样的-仍然有8个优先级在同一个优先级组中。
设置了较高的值时、情况将会有所不同、例如、 0b101。 在这种情况下、2位在组优先级中、1位在子优先级中。
在本示例中、当您有三个中断时:
INT1 -优先级0 (组/优先级0、子组优先级0)
INT2 -优先级1 (组/优先级0、子组优先级1)
INT3 -优先级2 (组/优先级1、子组优先级0)
那么 INT1和 INT2都在一个抢占组0中。 这意味着 INT1和 INT2都可以优先于 INT3。 但是 INT1和 INT2不能互相抢占(因为它们 具有 相同的占位组)。 当 INT2和 INT1都处于挂起状态时、INT1将首先执行、然后在完成 INT1后执行 INT2。
希望我提供的所有信息都是正确的。
此致、
Andy
感谢 Andy 的快速而清晰的回应。