原创 (转载)中断控制及basepri 与 basepri_max

2020-7-23 16:20 125 2 2 分类: MCU/ 嵌入式 文集: STM32应用

 

正文

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、源开关

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

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

文章评论0条评论)

登录后参与讨论
相关推荐阅读
RLink 2020-09-10 14:49
rtthread scons使用备注
1. 更改默认环境变量使用scons编译时,RTT_CC环境变量用于标识编译时使用的工具链,默认配置使用gcc,如果需要修改为iar,则可以编辑文件env_released_1.2.0\env\too...
RLink 2020-07-23 11:27
(转载)ucos中的三种临界区管理机制
熟悉ucos,或者读过Jean.J.Labrosse写过的ucos书籍的人,一定会知道ucos中著名的临界去管理宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。同样是...
RLink 2020-07-23 10:44
(转载)Cortex-M0/M0+屏蔽优先级低于BASEPRI设定的中断
Cortex-M3/M4/M7有BASEPRI特殊功能寄存器可以屏蔽优先级低于BASEPRI设定值的中断,但Cortex-M0/M0+没有BASEPRI寄存器,不过仍然可以实现相识的功能。mingdu...
RLink 2020-07-09 15:12
STM32L系列I2C应用注意
噪音滤波器I2C模块包含模拟噪音滤波器和数字噪音滤波器,其中模拟噪音滤波器可以抑制尖峰宽度高达50ns(满足快速模式协议规格),用户可以选择关闭这一特性;数字滤波器抑制尖峰噪音的长度可以通过软件配置,...
RLink 2020-07-04 06:23
STM32L系列电源管理
电源供应1. VDD -> 1.8V~3.6V,用于内部电压调整器和IO供电,通过外部管脚引入2. Vcore -> 1.2V~1.8V ,用于内部的各数字外围模块、SRAM和FLASH供电,通过内部...
广告
EE直播间
更多
我要评论
0
2
广告
关闭 热点推荐上一条 /6 下一条