一、中断介绍
我所使用的是的STM32F407内核是Cortex-M4内核,支持的中断有240个IRQ(中断请求)、1个是不可屏蔽的中断(NMI)、STM32F407内核是Cortex-M4处理器、1个是Systick(滴答定时器)定时器中断和多个系统异常。
1.中断优先级 中断是有优先级的,有优先级就会可能被打断,被打断就会出现中断嵌套的现象。中断优先级位数支持8位,但是芯片的生产厂家为了精简,不会全部实现,比如STM32一共4位,也就是有24=16级
2.优先级配置寄存器 优先级配置寄存器是8位宽,STM32把优先级分为高低两段:抢占优先级(分组优先级)和亚优先级(子优先级),所以怎么比较优先级呢,就是先比较分组优先级,如果分组优先级相同就比较亚优先级。 所以我们来看一下关于优先级分组,一共5组
((LP) == NVIC_LP_SLEEPONEXIT))
/**
* @}
*/
/** @defgroup MISC_Preemption_Priority_Group
* @{
*/
#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
0 bits for subpriority */
在使用FreeRTOS的时候,一般配置为NVIC_PriorityGroup_4,也就是4位抢占位,无亚优先级,之所以这么做是因为RTOS没有处理亚优先级
3.中断屏蔽寄存器 为什么需要终端屏蔽寄存器,当我们要执行一些不能被打断的,时序性很强的的操作的时候,就需要进行中断屏蔽寄存器,将中断进行屏蔽。 这三个寄存器是PRIMASK、FAULTMASK、BASEPRI
4.FreeRTOS的中断配置
#define configPRIO_BITS 4 //4位的优先级位
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //配置最低的优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //可管理的最大优先级 ,高于5的优先级不归RTOS管理
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY
关注
打赏
热门博文
- 一键安装失败
- ROS1/ROS2版本代号
- ROS节点间话题通讯问题
- ROS机械臂启动碰撞检测和启动捡拾算法时出现的两个错误,有大佬能帮忙解决吗
- 树莓派4B(Pi buster)一键安装apt存在问题,WARNING: apt does not have a stable CLI interface
- 如何去掉Gazebo的不对某个关节进行碰撞属性
- Ubuntu18.04 realsenseD435i深度摄像头外参标定的问题
- 运行sudo apt-get install ros-foxy-rmf-demos-gz时出现软件包不能安装的问题
- 运行ros2 control指令提示 [RTPS_TRANSPORT_SHM Error] Failed init_port fastrtps_port
- setuptools-scm was unable to detect version for‘…/…/某git包‘