• FreeRTOS Cortex-M 中断管理


    目录

    1.中断简介

    中断的优先级数字越小优先级越大,这是它内部的15个 

     外部的有140个但用不了那么多 

    ​编辑

     WEAK

     NVIC 的访问地址是 0xE000_E000

     NVIC结构体里的寄存器

    优先级的定义  

    2.优先级分组 

     3.优先级设置

    4.中断屏蔽寄存器

    FreeRTOS中断配置

     注意


    1.中断简介

    中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生之后CPU就会中断当前的流程而去处理中断服务,Cortex-M 内核的MCU提供了一个用于中断管理的嵌套向量中断控制器NVIC。
    Cotex-M3和M4的NVIC最多支持240个IRQ(中断请求),1个不可屏蔽中断(NM)),1个Systick(滴答定时器)定时器中断和多个系统异常。

    与中断相关的寄存器都在NVIC和SCB中。

    中断的优先级数字越小优先级越大,这是它内部的15个 

    __Vectors向量中断表 

     外部的有240个但用不了那么多 

     WEAK

    WEAK函数就是已经定义了的,我过我们重写,他就不会调用这里面的函数了,就会调用我们自己写的函数(32里的printf重定向说到)

     NVIC 的访问地址是 0xE000_E000

    NVIC的地址就是0xE000E000加上偏移地址0x0100,

     NVIC结构体里的寄存器

    这些寄存器都是跟中断相关

    优先级的定义  

    1. CM3 中,优先级对于异常来说很关键的,它会影响一个异常是否能被响应,以及何
    2. 时可以响应。优先级的数值越小,则优先级越高。CM3 支持中断嵌套,使得高优先级异常
    3. 会抢占(preempt)低优先级异常。有 3 个系统异常:复位,NMI 以及硬 fault,它们有固定的
    4. 优先级,并且它们的优先级号是负数,从而高于所有其它异常。所有其它异常的优先级则都
    5. 是可编程的(但不能编程为负数)。
    6. 原则上,CM3 支持 3 个固定的高优先级和多达 256 级的可编程优先级,并且支持 128
    7. 级抢占

    优先级寄存器是由  __IO uint8_t  IP[240]; 决定的,最多有240个外部中断

     正常我们用4位用来表达优先级4567,它这里举例用3个

     

    2.优先级分组 

    1. 为了使抢占机能变得更加可控,CM3还把256级优先级按位分
    2. 成高低两段,分别是抢占优先级和亚优先级,MSB所在的位段(左边
    3. 的)对应抢占优先级,而LSB所在的位段(右边的)对应亚优先级。
    4. 分组位置 表达抢占优先级的位段表达亚优先级的位段

    优先级分组通过寄存器AIRCR设置(地址为OXEOOOEDOC)

    7:1意思是说第7位到第1位都表示抢占优先级,第0位表示亚优先级,下面以此类推,所以我们最多用128来表示抢占优先级 

    如果我们要使用4位的话,低四位不用,我们要左移4位才是我们最终的优先级

     对应上表76543,这5中情况

    寄存器AIRCR地址就是这么来的

     优先级分组实际上是调用 SCB->AIRCR 控制优先级分组,通过寄存器来进行设定

     3.优先级设置

    1. 对于外设中断优先级的设置可以通过奇存器:
    2. OXE000 E400 ~ OXEOOOE4EF
    3. 系统异常中断通过寄存器
    4. OXE000 ED18 ~ OXE000ED23

    4.中断屏蔽寄存器

    详细可查

    1. 中断屏蔽寄存器有3个:
    2. 1.PRIMASK
    3. 2.PAULTMASK
    4. 3.BASEPRI
    5. 用于中断屏蔽的特殊寄存器
    6. PRIMASK, FAULTMASK 和 BASEPRI这三个寄存器,可以参考上面链接,大致了解这三个中断屏蔽寄存器。
    7. BASEPRI寄存器可以只屏蔽低于某一阈值的优先级中断,FreeRTOS的开关中断就是通过BASEPRI这个寄存器实现。
    8. 想屏蔽某一阈值之下的优先级,直接将优先级写进寄存器即可,写入0就停止屏蔽中断

    freeRTOS使用第三个

    关闭中断和开启中断, 

    关闭

     用的出最高优先级去关闭

     使能中断,vPortSetBASEPRI( 0 )有一个形参0,把0传进去,把0写进basepri里

     这两个寄存器不是freertos用

    FreeRTOS中断配置

    我们用四位配置中断优先级,所以中断优先级配置都要8 - configPRIO_BITS左移四位

    在FreeRTOS 中 0-4 的优先级 不受它的管理 5-15 才是它的管理范围

     configLIBRARY_LOWEST_INTERRUPT_PRIORITY

    此宏是用来设置最低优先级,前面说了,STM32优先级使用了4位,而且STM32配置的使用组4,也就是4位都是抢占优先级。因此优先级数就是16个,最低优先级那就是15。所以此宏就是15

    configLIBRARY_MAX_sYSCALL_INTERRUPT_PRIORITY

    此宏用来设置FreeRTOS系统可管理的最大优先级,讲解BASEPRI寄存器说的那个阈值优先级,这个大家可以自由设置,这里我设置为了5。也就是高于5的优先级(优先级数小于5)不归FrecRTOS管理!

     注意

    在mian函数的开始和结束是有临界段的,临界段里面其实就是调用了中断屏蔽的语句,临界段打开,临界段关闭,main函数里面的程序才能运行

  • 相关阅读:
    YOLO目标检测——PCB缺陷数据集下载分享【含对应voc、coco和yolo三种格式标签】
    Pixel3系统提取镜像备份并还原到另一台手机
    网络性能监控无法告诉你的 6 件事
    Electron开发环境准备
    个人电影网站web网页设计制作—— 影视公司5页 DIV+CSS制作 浮动布局
    html学习,html书写规范,骨架标签,图片标签,相对路径,html常用标签
    C# 查询腾讯云直播流是否存在的API实现
    Google Earth Engine ——我们如何筛选一个列表中的排序以时间为例
    设计模式——享元模式(Flyweight Pattern)+ Spring相关源码
    开源不到 48 小时获 35k star 的推荐算法「GitHub 热点速览」
  • 原文地址:https://blog.csdn.net/Paradise_Violet/article/details/126324367