freertos- 中断控制器及其中断管理(笔记)

1,中断重要概念

  • 中断服务函数
  • 中断嵌套
  • 中断向量表
  • 嵌套中断控制器NVIC,属于Cortex-M的的的的核。
  • 中断优先级

3,16个系统异常

     1-15的对应系统异常,大于等于16的则全是外部中断。除了个别异常的优先级被定死外,其他异常的优先级都是可编程的。

freertos- 中断控制器及其中断管理(笔记)_第1张图片

如图4所示,外部中断相关寄存器

#define NVIC((NVIC_Type *)NVIC_BASE)/ *!

typedef struct
{
  __IOM uint32_t ISER [8U]; / *!
        uint32_t RESERVED0 [24U];
  __IOM uint32_t ICER [8U]; / *!
        uint32_t RSERVED1 [24U];
  __IOM uint32_t ISPR [8U]; / *!
        uint32_t RESERVED2 [24U];
  __IOM uint32_t ICPR [8U]; / *!
        uint32_t RESERVED3 [24U];
  __IOM uint32_t IABR [8U]; / *!
        uint32_t RESERVED4 [56U];
  __IOM uint8_t IP [240U]; / *!
        uint32_t RESERVED5 [644U];
  __OM uint32_t STIR; / *!
NVIC_Type;

  __IOM uint32_t AIRCR; / *!

5,中断优先级分组

  • 优先级的数值越小,则优先级越高。
  • CM3支持中断嵌套,使得高优先级异常会抢占(抢占)低优先级异常。
  • 有3个系统异常:复位,NMI以及硬故,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常所有其它异常的优先级则都是可编程的(但不能编程为负数)。
  • CM3支持3个固定的高优先级和多达256级的可编程优先级,并且支持128级抢占。绝大多数CM3芯片都会精简设计,如8级,16级,32级等。它们在设计时会裁掉表达优先级的几个低端有效位。
  • 操作AIRCR寄存器,优先级分为个位段:MSB所在的位段(左边的)对应抢占优先级,而LSB所在的位段(右边的)对应
    亚优先级
  • 函数接口void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
     

    freertos- 中断控制器及其中断管理(笔记)_第2张图片

  • freertos- 中断控制器及其中断管理(笔记)_第3张图片

如图6所示,外部中断源与设置中断源的优先级

  • 查看中断源类型定义,IRQn_Type类型。
  • void HAL_NVIC_SetPriority(IRQn_Type IRQn,uint32_t PreemptPriority,uint32_t SubPriority)去操作IP寄存器

7,中断向量表

  • 当发生了异常并且要响应它时,CM3需要定位其处理例程的入口地址。入口地址存储在所谓的“(异常)向量表”中
  • CM3允许向量表重定位 - 从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但也可以是RAM区。在RAM区就可以修改向量的入口地址了。见向量表偏移量寄存器(VTOR)。
  • 向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上增大到是2的整理幂,而起始地址必须对齐到后者的边界上。
  • 见startup_stm32f407xx.s

8,中断屏蔽方法(异常掩蔽寄存器)

  • PRIMASK用于除能在NMI和硬故障之外的所有异常,它有效地把当前优先级改为0(可编程优先级中的最高优先级)。
  • FAULTMASK它把当前优先级改为-1。这么一来,连硬断都被掩蔽了。方案使用
    与PRIMASK的相似。但要注意的是,FAULTMASK会在异常退出时自动清零。
  • BASEPRI优先级阀值屏蔽。往BASEPRI中写0,将停止掩蔽任何中断。

9,系统异常系统定时器中断与sendSv中断优先级设置

    vTaskStartScheduler()----> xPortStartScheduler()---->:

    / *使PendSV和SysTick成为优先级最低的中断。* /
    portNVIC_SYSPRI2_REG | = portNVIC_PENDSV_PRI;
    portNVIC_SYSPRI2_REG | = portNVIC_SYSTICK_PRI;

 

10,FreeRTOS操作系统的操作系统中应用

#define portDISABLE_INTERRUPTS()\
{\
    __set_BASEPRI(configMAX_SYSCALL_INTERRUPT_PRIORITY); \
    __DSB(); \
    __ISB(); \
}

#define portENABLE_INTERRUPTS()__ set_BASEPRI(0)

#define configMAX_SYSCALL_INTERRUPT_PRIORITY(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY <<(8 - configPRIO_BITS))

#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

注意:在FreeRTOS操作系统中小于等于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断中是可以使用“FromISR”结尾的函数,并且可嵌套。

 

11、什么情况下需要关闭中断?

 

你可能感兴趣的:(FreeRtos系统)