FreeRTOS学习之中断

优先级分组
Cortex-M处理器有三个固定优先级和256个可编程的优先级,最多有128个抢占优先级,但实际上STM32将优先级精简为16级优先级,在精简的时候会裁掉表达优先级的几个低端有效位,保留高4位表达优先级

Cortex-M处理器把256个优先级按位分为高低两段:抢占优先级和子优先级。STM32使用了4位,因此最多有5组优先级分组设置:
 NVIC_PriorityGroup_0  0位抢占优先级,4位子优先级
 NVIC_PriorityGroup_1  1位抢占优先级,3位子优先级
 NVIC_PriorityGroup_2  2位抢占优先级,2位子优先级
 NVIC_PriorityGroup_3  3位抢占优先级,1位子优先级
 NVIC_PriorityGroup_4  4位抢占优先级,0位子优先级(16个抢占优先级,没有子优先级)

用于屏蔽中断的特殊寄存器(PRIMASK、FAULTMASK、BASEPRI)
PRIMASK用于屏蔽除NMI和HardFault外的所有异常和中断
FAULTMASK用于屏蔽除NMI外的所有中断(即相比PRIMASK,FAULTMASK还可以屏蔽HardFault中断)
BASEPRI用于关闭优先级大于某个阈值(阈值由宏configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY决定)的中断,优先级高于这个阈值的中断就不会被关闭。Free RTOS就是操作BASEPRI寄存器来实现开关中断的。
注:优先级越高,优先级数越小。即优先级0>优先级15

宏configKERNEL_INTERRUPT_PRIORITY用来设置PendSV和滴答定时器的中断优先级

临界段代码:
Free RTOS与临界段代码保护有关的函数有4个:
任务级临界段代码保护:taskENTER_CRITICAL(),taskEXIT_CRITICAL()
中断级临界段代码保护:taskENTER_CRITICAL_FROM_ISR(),taskEXIT_CRITICAL_FROM_ISR()
在执行临界段代码时,优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断都得不到及时的响应
中断级临界段代码保护是用在中断服务程序中的,且这个中断的优先级一定要低于 configMAX_SYSCALL_INTERRUPT_PRIORITY

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值