stm32和Zynq的中断抢占机制 - 实践

stm32和Zynq的中断抢占机制 - 实践

stm32和Zynq都支持中断抢占,但它们的搭建机制和细节有所不同。

1. STM32 (基于ARM Cortex-M内核)

STM32微控制器普遍采用ARM Cortex-M系列内核(如M0, M3, M4, M7等),其嵌套向量中断控制器(NVIC)提供了非常强大和灵活的中断管理功能,包括硬件级别的中断抢占。

  1. 优先级配置

    • 通过NVIC中的每个中断源都能够被分配一个可编程的优先级。
    • 优先级数值越小,优先级越高。优先级0是最高优先级。
    • STM32允许你将优先级寄存器分成抢占优先级子优先级两个字段。这是通过NVIC_SetPriorityGrouping()函数或修改SCB->AIRCR寄存器来配置的。
  2. 抢占机制

    • 当处理器正在执行一个中断服务程序(ISR)时,如果一个更高抢占优先级的中断发生,那么当前正在处理的低优先级中断会被挂起,处理器会立即转去执行更高优先级的ISR。
    • 等高优先级ISR执行完毕后,处理器再返回到被挂起的低优先级ISR继续执行。
    • 子优先级不能决定抢占。它只在多个相同抢占优先级的中断同时等待处理时,决定先执行哪一个。它不能打断正在执行的同抢占优先级的ISR。

2. Zynq-7000 SoC

Zynq芯片分为处理系统(PS)和可编程逻辑(PL)两大部分。其中断体系更为复杂,但PS端的ARM Cortex-A9双核处理器也完全支持中断抢占。

  1. 通用中断控制器(GIC)

  2. 抢占机制

  3. 特殊考虑

3. 对比总结

特性STM32 (Cortex-M)Zynq PS (Cortex-A9)
中断控制器NVICGIC-400
是否支持抢占
优先级规则数值越小,优先级越高数值越小,优先级越高
优先级配置分组(抢占优先级/子优先级)每个中断源独立优先级寄存器
特殊模式协助IRQ和FIQ,FIQ优先级最高
典型应用环境裸机、RTOS (FreeRTOS, etc.)裸机、RTOS、Linux等完整OS
复杂度相对容易,直截了当更复杂,功能更强大