【FreeRTOS操作系统教程】第12章 FreeRTOS中断优先级配置(重要)
单片机指令的中断处理与优先级设置

单片机指令的中断处理与优先级设置中断处理是单片机系统中非常重要的一个概念,它允许在程序执行过程中暂停当前任务,转而执行其他的紧急任务。
在单片机系统中,中断按照优先级来进行处理,优先级较高的中断具有更高的执行权。
本文将探讨单片机指令的中断处理及优先级设置的相关知识。
一、中断处理的基本流程单片机中断处理的基本流程包括中断的触发、中断的响应和中断的处理。
1. 中断的触发中断的触发是指引起中断的事件发生,例如外部输入的信号改变或者定时器计数器溢出等。
当发生中断触发事件时,单片机会检测到该事件,并决定是否触发相关的中断。
2. 中断的响应中断的响应是指单片机在发生中断触发事件后,立即停止当前任务的执行,保存当前任务的状态,并转而执行中断服务程序。
为了保证中断处理的正确性,单片机需要在中断响应之前关闭其他中断的触发,以保证只有最高优先级的中断得以响应。
3. 中断的处理中断的处理指单片机执行对应中断的服务程序。
中断服务程序是一个独立的子程序,用于处理中断触发事件。
根据具体的应用需求,中断服务程序可以进行一系列的操作,例如读写寄存器、处理数据、发送接收数据等。
处理完成后,需要恢复原来的状态,并返回到原来的任务继续执行。
二、中断优先级设置为了合理地处理多个中断,单片机中提供了中断优先级设置的功能。
不同的中断可以设置不同的优先级,以确保高优先级的中断能够及时得到处理。
1. 优先级的概念优先级是用来区分不同中断响应顺序的标志。
单片机一般会提供多个中断请求引脚,每个引脚连接一个外设设备。
设置不同中断的优先级可以根据外设设备的重要性和响应要求来确定。
2. 优先级的设置方法在单片机中,一般都会提供中断优先级设置的相关控制位或寄存器。
我们可以通过设置这些位或寄存器来对中断进行优先级的设置。
具体的设置方法可以根据不同的单片机型号来确定,一般会提供相应的中断控制寄存器或指令用于设置中断的优先级。
一般来说,越低的优先级对应的中断响应越晚。
FreeRTOS操作系统配置参数说明

当然,如果没有使用内核方面的调试器,这个宏定义是没有意义的。
USE_APPLICATION_TASK_TAG
处于就绪状态的相同优先级任务使用时间片调度机制共享处理器时间。
MINIMAL_STACK_SIZE
此参数用于定义空闲任务的栈空间大小,单位字。默认128个字
MAX_TASK_NAME_LEN
定义任务名最大的字符数
USE_16_BIT_TICKS
系统时钟节拍计数使用TickType_t数据类型定义的。
图中描述了四个处于空闲优先级的任务,任务A、B和C是用户任务,任务I是空闲任务。上下文切换周期性的发生在T0、T1…T6时刻。当用户任务运行时,空闲任务立刻让出CPU,但是,空闲任务已经消耗了当前时间片中的一定时间。这样的结果就是空闲任务I和用户任务A共享一个时间片。用户任务B和用户任务C因此获得了比用户任务A更多的处理器时间。
USE_TASK_NOTIFICATIONS
设置USE_TASK_NOTIFICATIONS为Enable将会开启任务通知功能,有关的API函数也会被编译。设置宏USE_TASK_NOTIFICATIONS为Disabled则关闭任务通知功能,相关API函数也不会被编译。默认这个功能是开启的。开启后,每个任务多增加8字节RAM。
USE_PORT_OPTIMISED_TASK_SELECTION
FreeRTOS的硬件有两种方法选择下一个要执行的任务:通用方法和特定于硬件的方法。
Disabled:可以用于所有FreeRTOS支持的硬件;完全用C实现,效率略低于特殊方法;不强制要求限制最大可用优先级数。
freertos 讲解

freertos 讲解**FreeRTOS讲解******FreeRTOS是一个开源的实时操作系统,广泛应用于嵌入式系统。
在本文档中,我们将深入探讨FreeRTOS的核心特性、优势及应用场景,帮助您全面了解这一强大的操作系统。
**一、FreeRTOS简介**FreeRTOS是一个免费的实时操作系统,由Real Time Engineers Ltd.维护。
它遵循MIT开源协议,可以免费用于商业和非商业项目。
FreeRTOS支持多种硬件平台,如ARM、AVR、MSP430等,具有高度可扩展性和模块化特点。
**二、FreeRTOS核心特性**1.任务管理:FreeRTOS采用基于优先级的任务调度算法,支持多任务并发执行,确保高优先级任务能够及时获得处理器资源。
2.时间管理:FreeRTOS提供了精确的时间管理功能,包括定时器、延时函数等,以满足实时性要求。
3.内存管理:FreeRTOS提供了动态内存分配和回收机制,支持堆内存管理,以满足不同任务的内存需求。
4.通信机制:FreeRTOS支持多种通信机制,如信号量、互斥量、消息队列等,用于任务间的同步和数据传递。
5.中断管理:FreeRTOS允许在中断服务程序中调用操作系统服务,提高了中断处理的实时性。
6.可扩展性:FreeRTOS支持多种硬件平台,用户可以根据需求添加或删除功能模块,实现高度定制化。
**三、FreeRTOS优势**1.开源免费:FreeRTOS遵循MIT协议,可以免费使用,降低了开发成本。
2.实时性:FreeRTOS具有优异的实时性能,能够满足各种实时性要求较高的应用场景。
3.跨平台:FreeRTOS支持多种硬件平台,方便开发者进行跨平台开发。
4.易用性:FreeRTOS提供了丰富的API接口,易于学习和使用。
5.社区支持:FreeRTOS拥有庞大的开发者社区,可以获得丰富的技术支持和资源。
**四、FreeRTOS应用场景**1.嵌入式系统:FreeRTOS广泛应用于嵌入式领域,如智能家居、工业控制、医疗设备等。
中断优先级程序设计

中断优先级程序设计中断是计算机系统中一种重要的机制,它可以在程序执行过程中,根据特定的条件或事件发生时,暂停当前正在执行的程序,转而执行相应的中断服务程序。
中断优先级程序设计是指在多个中断同时发生时,根据优先级的设定,决定中断的处理顺序。
中断优先级程序设计的目的是为了提高系统的响应速度和效率。
在实际应用中,不同的中断可能具有不同的紧急程度和重要性,因此需要根据实际需求,合理地设置中断的优先级。
一般来说,中断的优先级可以分为高优先级和低优先级两种。
在中断优先级程序设计中,高优先级的中断会立即打断正在执行的低优先级中断或主程序,转而执行高优先级中断的服务程序。
这样可以确保高优先级中断的及时处理,避免因低优先级中断或主程序的执行而延误高优先级中断的处理。
而低优先级中断则会在高优先级中断处理完毕后再继续执行。
中断优先级程序设计的实现需要借助硬件和软件的支持。
在硬件方面,可以通过设置中断控制器的优先级寄存器来确定中断的优先级。
在软件方面,可以通过编程的方式,设置中断的优先级。
一般来说,中断的优先级可以通过设置中断向量表或中断服务程序的调用顺序来实现。
在实际应用中,中断优先级程序设计可以应用于各种场景。
例如,在实时操作系统中,可以根据任务的紧急程度和重要性,设置不同的中断优先级,以确保系统对关键任务的及时响应。
在通信系统中,可以根据不同的通信协议和数据传输方式,设置不同的中断优先级,以确保数据的准确传输和处理。
在嵌入式系统中,可以根据外部设备的特性和工作模式,设置不同的中断优先级,以确保系统对外部设备的及时响应。
总之,中断优先级程序设计是一种重要的程序设计方法,它可以提高系统的响应速度和效率。
通过合理地设置中断的优先级,可以确保系统对不同事件的及时处理,提高系统的可靠性和稳定性。
在实际应用中,我们需要根据具体的需求和场景,灵活地运用中断优先级程序设计,以实现更好的系统性能和用户体验。
freertos的中断管理及其他用法

FreeRTOS 是一个用于嵌入式系统的实时操作系统(RTOS),它提供了丰富的功能和API,方便开发者进行任务管理、中断管理和其他实时操作系统的相关操作。
以下是FreeRTOS 中断管理和其他用法的概述:1. 中断管理:- FreeRTOS 提供了`vPortEnterCritical()` 和`vPortExitCritical()` 函数来实现中断的临界区保护。
在进入临界区前调用`vPortEnterCritical()`,在离开临界区时调用`vPortExitCritical()`。
这样可以避免多个中断同时访问共享资源的竞态条件。
- FreeRTOS 还支持软件自动优先级调度(Priority Inheritance Protocol, PIP),这可以确保高优先级任务可以及时响应中断。
2. 任务管理:- 使用FreeRTOS,您可以使用`xTaskCreate()` 函数来创建任务。
每个任务都有自己的优先级和堆栈空间。
- FreeRTOS 提供了任务管理的API,例如:`vTaskDelay()` 用于延迟任务的执行,`vTaskDelete()` 用于删除任务,`vTaskSuspend()` 和`vTaskResume()` 用于暂停和恢复任务的执行等。
- 您可以使用`xTaskCreateStatic()` 函数创建静态任务,从而节省动态分配内存的开销。
3. 信号量和互斥量:- FreeRTOS 提供了两种同步机制:二进制信号量和计数信号量。
您可以使用`xSemaphoreCreateBinary()` 和`xSemaphoreCreateCounting()` 函数创建信号量。
- 使用`xSemaphoreTake()` 和`xSemaphoreGive()` 函数获取和释放信号量,以控制任务和中断之间的访问权。
- 互斥量是一种特殊的信号量,用于实现任务对共享资源的互斥访问。
您可以使用`xSemaphoreCreateMutex()` 函数创建互斥量。
[FreeRTOS入门]1.CubeMX中FreeRTOS配置参数及理解
![[FreeRTOS入门]1.CubeMX中FreeRTOS配置参数及理解](https://img.taocdn.com/s3/m/c0e91a0353d380eb6294dd88d0d233d4b14e3fc5.png)
[FreeRTOS⼊门]1.CubeMX中FreeRTOS配置参数及理解1.有关优先级 1.1 Configuration --> FreeRTOSMAX_PRIORITIES 设置任务优先级的数量:配置应⽤程序有效的优先级数⽬。
任何数量的任务都可以共享⼀个优先级,使⽤协程可以单独的给与它们优先权。
见MAX_CO_ROUTINE_PRIORITIES。
在RTOS内核中,每个有效优先级都会消耗⼀定量的RAM,因此这个值不要超过你的应⽤实际需要的优先级数⽬。
每⼀个任务都会被分配⼀个优先级,优先级值从0~(MAX_PRIORITIES - 1)之间。
低优先级数表⽰低优先级任务。
空闲任务的优先级为0(PriorityIdle),因此它是最低优先级任务。
FreeRTOS调度器将确保处于就绪状态(Ready)或运⾏状态(Running)的⾼优先级任务⽐同样处于就绪状态的低优先级任务优先获取处理器时间。
换句话说,处于运⾏状态的任务永远是⾼优先级任务。
处于就绪状态的相同优先级任务使⽤时间⽚调度机制共享处理器时间。
Interrupt nesting behaviour configuration 断⾔配置LIBRARY_LOWEST_INTERRUPT_PRIORITY此宏定义是⽤来配置 FreeRTOS中⽤到的SysTick中断和PendSV中断的优先级reeRTOSreeRTOSreeRTOSreeRTOS ⽤到的 SysTSysT ick 中断和 PendSV中断的优先级。
在 NVIC分组设置为4的情况下,此宏定义的范围就是 0-15 ,即专门配置抢占优先级。
这⾥即专门配置抢占优先级。
这⾥配置为了 15,即 SysTick和 PendSV 都配配置为了最低优先级,实际项⽬中也建议配置为最低优先级。
LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY定义了受FreeRTOS管理的最⾼优先级中断。
FreeRTOS 配置说明

FreeRTOS初步(转)用了半天时间对FreeRTOS有了一个初步的认识,大概总结一下,其中混杂了系统实现和实际应用方面的问题。
现只是以应用为目的,实现方面待以后进一步研究。
1.FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理。
与平台有关的文件包含在portable文件夹中,主要是port.c, portmacro.h两个文件。
平台无关的文件主要是:list.c(基本链表结构), queue.c(包括消息队列,信号量的实现), croutine.c,tasks.c(任务管理,时间管理)。
命名协定RTOS内核与范例程序源代码使用下面的协定:变量char类型的变量以 c 为前缀short类型的变量以 s 为前缀long类型的变量以 l 为前缀float类型的变量以 f 为前缀用了半天时间对FreeRTOS有了一个初步的认识,大概总结一下,其中混杂了系统实现和实际应用方面的问题。
现只是以应用为目的,实现方面待以后进一步研究。
1.FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理。
与平台有关的文件包含在portable文件夹中,主要是port.c, portmacro.h两个文件。
平台无关的文件主要是:list.c(基本链表结构), queue.c(包括消息队列,信号量的实现), croutine.c,tasks.c(任务管理,时间管理)。
命名协定RTOS内核与范例程序源代码使用下面的协定:变量char类型的变量以 c 为前缀short类型的变量以 s 为前缀long类型的变量以 l 为前缀float类型的变量以 f 为前缀double类型的变量以 d 为前缀枚举变量以 e 为前缀其他类型(如结构体)以 x 为前缀指针有一个额外的前缀 p , 例如short类型的指针前缀为 ps无符号类型的变量有一个额外的前缀 u , 例如无符号short类型的变量前缀为 us函数文件内部函数以prv为前缀API函数以其返回值类型为前缀,按照前面对变量的定义函数的名字以其所在的文件名开头。
freertos技巧

freertos技巧FreeRTOS是一款常用的嵌入式实时操作系统(RTOS),它提供了丰富的功能和对多种硬件平台的支持。
使用FreeRTOS不仅能够提高开发效率,还能够有效地优化系统性能,实现高效、稳定的系统运行。
本文针对FreeRTOS使用的一些技巧做出简要的介绍。
1. 简化任务优先级的管理任务优先级是实时操作系统中非常重要的一个概念。
在FreeRTOS中,任务优先级的管理需要使用一些特定的API函数进行处理,这往往会带来很大的复杂性和不必要的麻烦。
因此,为了简化任务优先级的管理,可以采用优先级反转机制,减少任务优先级的数量。
具体做法是将中间的任务优先级删除,只保留最高和最低两个优先级,这样可以有效降低系统的复杂度,提高系统的稳定性。
2. 使用任务通知简化任务之间的通讯在实时操作系统中,任务之间的通讯是非常重要的一个问题。
FreeRTOS提供了多种任务通讯的方式,其中最常用的是任务通知。
任务通知能够在任务间高效地传递消息,而且可以针对特定事件进行精细的控制,非常适合需要高效通讯的场景。
3. 合理使用中断控制器中断控制器在实时操作系统中扮演着非常重要的角色。
在使用FreeRTOS时,合理使用中断控制器可以大大提高系统的性能和稳定性。
具体来说,可以使用中断优先级控制来确保一些关键中断始终都能够得到及时处理,从而保证系统的实时性。
4. 使用导出代码分析系统性能FreeRTOS提供了一些导出代码分析工具,可以帮助我们对系统性能进行分析和优化。
通过这些工具,我们可以了解各个任务的行为和系统资源的使用情况,发现潜在的性能问题,从而对系统进行优化。
总之,FreeRTOS是一款非常优秀的嵌入式实时操作系统,它为我们提供了众多的功能和优化手段。
通过巧妙地应用各种技巧,我们不仅可以提高系统的性能和稳定性,还可以加快开发步伐,实现更加出色的嵌入式系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第12章F r e e R T O S中断优先级配置(重要)本章节为大家讲解FreeRTOS中断优先级配置,此章节非常重要,初学者经常在这里犯迷糊。
对于初学者来说,本章节务必要整明白。
12.1 NVIC基础知识12.2 使用FreeRTOS时如何配置外设NVIC12.3 FreeRTOS配置选项中NVIC相关配置12.4 不受FreeRTOS管理中的的深入讨论12.5总结12.1N V I C基础知识NVIC的全称是Nested vectored interrupt controller,即嵌套向量中断控制器。
对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。
8位的话就可以设置2^8 = 256级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。
比如ST 的STM32F1xx和F4xx只使用了这个8位中的高四位[7:4],低四位取零,这样2^4=16,只能表示16级中断嵌套。
对于这个NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优先级,下面就以STM32为例进行介绍,STM32F1xx和F4xx都是只使用了这个8位寄存器的高四位[7:4]。
优先级分组 抢占优先级 子优先级 高4位使用情况描述 NVIC_PriorityGroup_0 0级抢占优先级 0-15级子优先级 0bit用于抢占优先级4bit全用于子优先级 NVIC_PriorityGroup_1 0-1级抢占优先级 0-7级子优先级 1bit用于抢占优先级3bit用于子优先级 NVIC_PriorityGroup_2 0-3级抢占优先级 0-3级子优先级 2bit用于抢占优先级2bit用于子优先级 NVIC_PriorityGroup_3 0-7级抢占优先级 0-1级子优先级 3bit用于抢占优先级1bit用于子优先级 NVIC_PriorityGroup_4 0-15级抢占优先级 0级子优先级 4bit全用于抢占优先级0bit用于子优先级图12.1 优先级分组0,也就是没有抢占式优先级,只有子优先级,关于这个抢占优先级和这个子优先级有几点一定要说清楚。
●具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。
●在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。
●在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。
●Reset、NMI、Hard Fault 优先级为负数,高于普通中断优先级,且优先级不可配置。
●对于初学者还有一个比较纠结的问题就是系统中断(比如:PendSV,SVC,SysTick)是不是一定比外部中断(比如SPI,USART)要高,答案:不是的,它们是在同一个NVIC下面设置的。
掌握了这些基础知识基本就够用了。
另外特别注意一点,配置抢占优先级和子优先级,他们合并成的4bit数字的数值越小,优先级越高,这一点千万不要搞错了,下面通过12.2小节举一个实例。
12.2使用F r e e R T O S时如何配置外设N V I C强烈推荐用户将Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及STM32F429的NVIC优先级分组设置为4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断优先级的管理将非常方便。
这个也是官方强烈建议的。
此函数在bsp_Init中第一个被调用:/********************************************************************************************************** * 函 数 名: bsp_Init* 功能说明: 初始化硬件设备。
只需要调用一次。
该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
* 全局变量。
* 形 参: 无* 返 回 值: 无********************************************************************************************************* */void bsp_Init(void){/* 优先级分组设置为4, 优先配置好NVIC */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);bsp_InitUart(); /* 初始化串口 */bsp_InitLed(); /* 初始LED指示灯端口 */bsp_InitKey(); /* 初始化按键 */}(注意:一旦初始化好NVIC的优先级分组后,切不可以在应用中再次更改。
)设置NVIC的优先级分组为4表示支持0-15级抢占优先级(注意,0-15级是16个级别,包含0级),不支持子优先级。
反映在STM32标准库的配置上就是如下:/********************************************************************************************************** * 函 数 名: TIM_Config* 功能说明: 配置定时器TIM2的中断* 形 参:无* 返 回 值: 无********************************************************************************************************* */static void TIM_Config(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;/* 抢占优先级设置,优先级分组为4的情况下,抢占优先级可设置范围0-15 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;/* 子优先级设置,优先级分组为4的情况下,子优先级无效,取数值0即可 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}在这里继续强调下这一点,在NVIC分组为4的情况下,抢占优先级可配置范围是0-15,那么数值越小,抢占优先级的级别越高,即0代表最高优先级,15代表最低优先级。
12.3F r e e R T O S配置选项中N V I C相关配置FreeRTOSConfig.h配置文件中设置到NVIC中断的有如下几个选项:/* Cortex-M specific definitions. */#ifdef __NVIC_PRIO_BITS/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */#define configPRIO_BITS __NVIC_PRIO_BITS#else#define configPRIO_BITS 4 /* 15 priority levels */#endif/* The lowest interrupt priority that can be used in a call to a "set priority"function. */#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x0f/* The highest interrupt priority that can be used by any interrupt serviceroutine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALLINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHERPRIORITY THAN THIS! (higher priorities are lower numeric values. */#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x01/* Interrupt priorities used by the kernel port layer itself. These are genericto all Cortex-M ports, and do not rely on any particular library functions. */#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!See /RTOS-Cortex-M3-M4.html. */#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )#define configPRIO_BITS 4此宏定义用于配置STM32的8位优先级设置寄存器实际使用的位数。
STM32F103,STM32F407和STM32F429都是使用的4位。
另外注意一点,这里使用了一个条件编译,用户可以选择将条件编译删掉,直接定义一个#define configPRIO_BITS 4即可。
使用条件编译的好处就是方便与系统统一。
这个__NVIC_PRIO_BITS在STM32F103标准库的头文件stm32f10x.h中以及STM32F407/439的标准库的头文件stm32f4xx.h中分别有定义。