企业网站关键词放几个,好的产品设计网站,自适应单页网站模板,广西桂林天气前言 FreeRTOS的任务有优先级#xff0c;MCU的硬件中断有中断优先级#xff0c;这是两个不同的概念#xff0c;FreeRTOS的任务管理要用到硬件中断#xff0c;使用FreeRTOS时候也可以使用硬件中断#xff0c;但是硬件中断ISR的设计要注意一些设计原则#xff0c;在本节中我…前言 FreeRTOS的任务有优先级MCU的硬件中断有中断优先级这是两个不同的概念FreeRTOS的任务管理要用到硬件中断使用FreeRTOS时候也可以使用硬件中断但是硬件中断ISR的设计要注意一些设计原则在本节中我将详细介绍FreeRTOS与硬件中断的关系以及如何正确使用硬件中断
1、FreeRTOS与中断设置 中断是MCU的硬件特性FreeRTOS的运行要用到中断因为它的上下文切换就是在PendSV中断中进行的FreeRTOS还需要一个基础时钟产生滴答信号CubeMX中启动FreeRTOS后系统会自动对NVIC进行一些设置这些设置是必要的 启用FreeRTOS后中断优先级分组策略自动设置为4位全用于抢占优先级所以优先级编号是0到15这个参数在FreeRTOS中不能修改默认为4 FreeRTOS可管理的最高优先级默认值为5也就是说只有在中断优先级等于或大于5的中断ISR里才可以调用FreeRTOS的中断安全API函数也就是带 FromISR 后缀的函数使用taskDISABLE_INTERRUPTS() 函数也只能屏蔽优先级数值等于或者大于5的中断
2、任务与中断的关系 MCU的中断有中断优先级有中断服务例程ISRFreeRTOS的任务有任务优先级有任务函数这两者具体的特点和区别如下
1、中断是MCU特有的硬件属性由硬件时间和软件信号引起中断运行哪个ISR是由硬件决定的中断的优先级数字越小表示优先级越高所以中断的最高优先级是0
2、FreeRTOS的任务是一个纯软件概念与硬件系统无关任务的优先级是由开发者在软件中赋予的任务的优先级数字越低表示优先级越低所以任务的最低优先级为0FreeRTOS的任务调度器决定哪个任务处于运行状态FreeRTOS在中断优先级15的PendSV中断里进行上下文切换所以只要有中断ISR在运行FreeRTOS就无法进行切换
3、任务只有在没有ISR运行的时候才能运行即使是优先级最低的中断也可以打断高优先级的任务去执行而任务不能抢占ISR的运行 注意对最后一条规则的理解根据NVIC管理中断的原则同等抢占优先级的中断是不能发生抢占的一个优先级为15的RTC唤醒中断是不能抢占优先级为15的SysTick和PendSV中断的执行的这是因为SysTick和PendSV中断的ISR运行时间很短RTC唤醒中断的ISR能被及时执行但如果优先级为15的RTC唤醒中断执行时间很长那么SysTick和PendSV发生了中断也无法抢占也就无法进行任务调度任务函数也无法执行 所以在实际的软件设计中一般要尽量简化ISR的功能使其减少占用CPU的时间一般的硬件中断都是处理一些数据的接收或发送工作例如采用中断方式进行ADC数据采集时只需要把ADC的中断里将数据读取到缓冲区而对数据进行滤波频谱计算等耗时间的工作就转移到任务中处理。
3、中断屏蔽和临界段代码 一个任务函数在执行时可能会被其他高优先级的任务抢占CPU也可能被任何一个中断的ISR抢占CPU在某些时候任务的某段代码可能非常关键需要连续执行完不希望被其他任务或者中断打断这种程序段被成为临界段在FreeRTOS中有函数定义临界段代码也可以屏蔽系统的部分中断
我们在文件task.h中定义了几个宏函数定义代码如下函数功能见注释
//开启临界段代码
#define taskENTER_CRITICAL() portENTER_CRITICAL()
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()//退出临界段代码
#define taskEXIT_CRITICAL() portEXIT_CRITICAL()
#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )//屏蔽MCU的部分中断 5-15 以及解除屏蔽
#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS()
#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS()
4、在ISR中使用FreeRTOS的API函数 在中断的ISR里有时会需要调用FreeRTOS的API函数但是调用普通的API函数可能会存在问题例如在ISR中调用vTaskDelay()就会出现问题因为在vTaskDelay会使任务进入阻塞状态而ISR根本就不是任务ISR运行的时候也不能进行任务调度 为此FreeRTOS的API函数分为两个版本一个被成为“任务级”既普通名称的API函数另一个被成为“中断级”既带后缀的FromISR的函数中断API也被成为中断安全API函数 FreeRTOS将API函数分为两个版本的好处是在API的实现代码中无须判断调用这个API函数的是一个ISR还是一个任务否则需要增加额外的代码而且不同的MCU判断ISR和任务函数的机制也不一样所以两个版本的API函数会提升我们开发的效率 在ISR中绝对不能使用任务级API函数但是在任务函数中可以使用中断级API函数此外在FreeRTOS不能管理的高优先级中断的ISR中连中断级的API函数也不能调用
5、FreeRTOS中断及ISR的设计原则
根据FreeRTOS管理中断的特点中断优先级和ISR程序设计应该遵循如下原则
1、根据参数的设置MCU的优先级为0到15的中断分为FreeRTOS不可屏蔽中断和可屏蔽中断要根据中断的重要性和功能为其设置合适的中断优先级使其成为FreeRTOS的不可屏蔽中断和可屏蔽中断
2、ISR的代码应该尽量简短应该将比较耗时的处理功能转移到任务函数中实现
3、可屏蔽中断的ISR中能调用中断级的FreeRTOS API函数绝不能调用普通的API函数在不可屏蔽中断的ISR中不能调用任何的FreeRTOS的API函数