zoukankan      html  css  js  c++  java
  • 中断控制及basepri 与 basepri_max

    1、总开关

    每个CPU有一个中断总开关。通过CPU中断控制寄存器实现。Cortex-M的中断控制寄存器包括:FAULTMASK、PRIMASK、BASEPRI、BASEPRI_MAX。总开关的本质是变更当前执行优先级,根据Cortex-M的架构设计,只有优先级高于当前执行优先级的中断或异常才能抢占CPU。

    FAULTMASK

    设置为1后关闭所有中断和异常,包括HardFault异常,只有NMI和Reset可以得到响应。

    PRIMASK

    设置为1后关闭所有中断和除了HardFault异常外的所有其他异常,只有NMI、Reset和HardFault可以得到响应。

    BASEPRI

    设置为n后,屏蔽所有优先级数值大于等于n的中断和异常。Cortex-M的优先级数值越大其优先级越低。

    BASEPRI_MAX

    和BASEPRI类似,但有个限制,即后写入的优先级数值要比当前的BASEPRI值小才会起作用,否则不起作用。影响范围最广,影响CPU内的所有中断源。

    事实上BASEPRI_MAX和BASSEPRI是操作同一个寄存器,不过BASEPRI_MAX是一个条件写指令,可以通过下列等效功能代码理解:

    // atomic related functions for unittest.
    extern uint8_t atomic_BASEPRI;    // 用来模拟 BASEPRI 的值
    
    // BASEPRI 设置
    static inline uint8_t __set_BASEPRI(uint8_t prio)
    {
        atomic_BASEPRI = prio;    
    }
    
    // BASEPRI_MAX 设置
    static inline uint8_t __set_BASEPRI_MAX(uint8_t prio)
    {
        if(prio && (atomic_BASEPRI == 0 || atomic_BASEPRI > prio)) {
            atomic_BASEPRI = prio;
        }
    }

    疑问:线程模式下,当前优先级和中断优先级的抢占优先级相同,但中断的子优先级比当前子优先级高,会怎么样?当前优先级也分抢占优先级和子优先级吗?

    2、分开关

    Cortex-M包括一个嵌套向量中断控制器NVIC,每个外设在NVIC中都有一个对应的位,用来控制该外设的中断。

    • 写NVIC->ISER寄存器中外设对应位为1打开中断。
    • 写NVIC->ICER寄存器中外设对应位为1关闭中断。

    分开关只影响特定外设的中断。

    3、源开关

    外设通常有多个中断源,如接收到数据、发送完成、接收超时等等。外设通常提供中断使能寄存器控制哪些中断源产生时要向上汇报(向分开关汇报)。源开关与特定的外设相关,不同的外设会有不同的中断,有不同的中断控制寄存器。有些外设本身有总开关,该总开关控制该外设的所有中断。

    源开关影响范围最窄,仅影响外设的某一种中断源。

  • 相关阅读:
    Leetcode Excel Sheet Column Number
    AlgorithmsI PA2: Randomized Queues and Deques Subset
    AlgorithmsI PA2: Randomized Queues and Deques RandomizedQueue
    AlgorithmsI PA2: Randomized Queues and Deques Deque
    AlgorithmsI Programming Assignment 1: PercolationStats.java
    hdu多校第四场 1003 (hdu6616) Divide the Stones 机智题
    hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
    hdu多校第四场1001 (hdu6614) AND Minimum Spanning Tree 签到
    hdu多校第三场 1007 (hdu6609) Find the answer 线段树
    hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测
  • 原文地址:https://www.cnblogs.com/qiyuexin/p/8921718.html
Copyright © 2011-2022 走看看