FreeRTOS中断配置和临界段学习笔记

说明:此学习笔记参考正点原子STM32F1 FreeRTOS开发手册,笔记简洁,仅供参考,详细内容请关注正点原子

1.Cortex-M中断

  • Cotex-M3 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1 个 Systick(滴 答定时器)定时器中断和多个系统异常。
  • 在STM32中设置系统中断优先级为分组4,即 NVIC_PriorityGroup_4,因为这样4 位优先级就就都全是抢占优先级了都全是抢占优先级了,没有亚优先级,那么就有 0~15 共 16 个优先级,这样使用起来简单。NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4    
  • 0xE000_ED20~0xE000_ED23 这四个寄存器就可以拼接成一个地址为 0xE000_ED20 的 32 位寄 存器。这一点很重要!因为 FreeRTOS 在设置 PendSV 和 SysTick 的中断优先级的时候都是直接 操作的地址 0xE000_ED20。(这一点原子哥讲很重要,因为PendSV和SysTick都是操作地址0xE000_ED20,这样一次写入的是个 32 位的数据, SysTick 和 PendSV 的优先级寄存器分别对应这个 32 位数据的最高 8 位和次高 8 位,一个左移 16 位,一个左移 24 位了)。
  • 用于中断屏蔽的寄存器:PRIMASK 和 FAULTMASK 寄存器,需要暂时屏蔽所有的中断一执行一些对时序要求严格的任务的时候可以使用 PRIMASK 寄存器用于禁止除 NMI 和 HardFalut 外的所有异常和中断,将 1 写入 PRIMASK 禁止所有中断,将 0 写入 PRIMASK 以使能中断。                                                                                                                                  FAULTMASK 比 PRIMASK 更狠,它可以连 HardFault 都屏蔽掉,使用方法和 PRIMASK 类 似,FAULTMASK 会在退出时自动清零,将 1 写入 FAULTMASK 禁止所有中断,将 0 写入 FAULTMASK 使能中断。(HardFault 是Cortex-M系列MCU中最为常见的一种故障类中断,Hard Fault属于不可屏蔽中断,并且中断优先级固定为-1,在软件运行过程中如果产生了CPU无法正常处理的故障就会进入此中断)。                                                                      BASEPRI 寄存器:使用举例,如果只屏蔽优先级低于某一个阈值的中断,比如,我们要屏蔽优先级不高于 0X60 的中断,则可以使用如下汇编编程:MOV R0, #0X60 MSR BASEPRI, R0;如果需要取消 BASEPRI 对中断的屏蔽可以使用如下代码MOV R0, #0 MSR BASEPRI, R0;(注意!FreeRTOS 的开关中断就是操作 BASEPRI 寄存器来实现的!它可以关闭低于某个阈 值的中断,高于这个阈值的中断就不会被关闭!)。

2.FreeRTOS中断配置宏

  • configPRIO_BITS:此宏用来设置 MCU 使用几位优先级,STM32 使用的是 4 位,因此此宏为 4。
  • configLIBRARY_LOWEST_INTERRUPT_PRIORITY:此宏是用来设置最低优先级,前面讲了使用的优先级分组是4,所以优先级级数就是16个,即0-15,那么最低优先级就是15,所以 此宏就是 15,(MCU的架构不同值也不同,此笔记只针对STM32)。
  • configKERNEL_INTERRUPT_PRIORITY:此宏用来设置内核中断优先级。
  • configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:此宏用来设置 FreeRTOS 系统可管理的最大优先级,也就是BASEPRI 寄存器说的那个阈值优先级,这个可以自由设置,这里我设置为了 5,也就是高于 5 的优先级(优先级数0-5)不归 FreeRTOS 管理。
  • configMAX_SYSCALL_INTERRUPT_PRIORITY:此宏设置好以后,低于此优先级的中断可 以安全的调用 FreeRTOS 的 API 函数,高于此优先级的中断 FreeRTOS 是不能禁止的,中断服务函数也不能调用 FreeRTOS 的 API 函数。

3.FreeRTOS开关中断

  • FreeRTOS 开关中断函数为 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS()

4.临界段代码

  • 临界段是什么:代码的临界段也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。
  • taskENTER_CRITICAL()和 taskEXIT_CRITICAL()是任务级的临界代码保护,一个是进入临 界段,一个是退出临界段,这两个函数是成对使用的注意临界区代码一定要精简!因为进入临界区会关闭 中断,这样会导致优先级低于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断得不到及时的响应。
  • 中断实验我这里就不做记录了,需要请观看正点原子FreeRTOS手把手教学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值