
一、中断管理1、stm32 中的抢占优先级和响应优先级STM32 的中断优先级分为两部分抢占优先级 (Preemption)、子优先级 (Sub也叫响应优先级)由 NVIC 管理1抢占优先级主优先级高抢占优先级中断可以打断正在执行的低抢占优先级中断发生中断嵌套。2子优先级响应优先级不能打断别的中断不支持嵌套。当多个中断同时到来谁的子优先级数字更小谁先执行。如果一个中断已经在运行别的子优先级再高也不能抢它。2、FreeRTOS的中断管理在STM32中中断优先级是通过中断优先级配置寄存器的高4位 [7:4] 来配置的。因此STM32支持最多16级中断优先级其中数值越小表示优先级越高即更紧急的中断。FreeRTOS任务调度的任务优先级相反是数值越大越优先FreeRTOS中将PendSV和SysTick设置最低中断优先级数值最大15保证系统任务切换不会阻塞系统其他中断的响应。FreeRTOS利用BASEPRI寄存器实现中断管理屏蔽优先级低于某一个阈值的中断。比如BASEPRI设置为0x50只看高四位也就是5代表中断优先级在5~15内的均被屏蔽0~4的中断优先级正常执行。在中断服务函数中调用FreeRTOS的API函数需注意中断服务函数的优先级需在FreeRTOS所管理的范围内阈值由configMAX_SYSCALL_INTERRUPT_PRIORITY指定。建议将所有优先级位指定为抢占优先级位方便FreeRTOS管理。在中断服务函数里边需调用FreeRTOS的API函数必须使用带“FromISR”后缀的函数3、FreeRTOS的开关中断FreeRTOS 开关中断函数其实是宏定义在 portmacro.h 中有定义如下#defineportDISABLE_INTERRUPTS()vPortRaiseBASEPRI()#defineportENABLE_INTERRUPTS()vPortSetBASEPRI(0)调用portENABLE_INTERRUPTS() 它, FreeRTOS会打开管理的所有中断调用portDISABLE_INTERRUPTS() 它, FreeRTOS会关闭管理的所有中断4、FreeRTOS的临界段代码临界段代码又称为临界区指的是那些必须在不被打断的情况下完整运行的代码段。在FreeRTOS中进入临界段代码时需要关闭中断在处理完临界段代码后再重新开启中断。与临界段代码保护有关的函数有 4 个taskENTER_CRITICAL() 进入临界段。taskEXIT_CRITICAL() 退出临界段。taskENTER_CRITICAL_FROM_ISR() 进入临界段中断级。taskEXIT_CRITICAL_FROM_ISR()退出临界段中断级。进入和退出临界段是成对使用的。每进入一次临界段全局变量uxCriticalNesting都会加一每调用一次退出临界段uxCriticalNesting减一只有当 uxCriticalNesting 为 0 的时候才会调用函数 portENABLE_INTERRUPTS()使能中断。这确保了在存在多个临界段代码的情况下不会因为某个临界段代码的退出而破坏其他临界段的保护。只有当所有的临界段代码都退出时中断才会被重新使能。4、挂起和恢复任务调度器挂起和恢复任务调度器 调用此函数不需要关闭中断vTaskSuspendAll()挂起任务调度器。xTaskResumeAll()恢复任务调度器。与临界区不同的是挂起任务调度器时未关闭中断这种方式仅仅防止了任务之间的资源争夺中断仍然可以直接响应二、FreeRTOS中断管理实验1、实验目标学会FreeRTOS中断管理设置管理的优先级范围5~15。使用两个定时器一个优先级为4一个优先级为6。两个定时器每1s打印一段字符串。task1按下KEY1关中断按下KEY2开中断。观察两个定时器的打印情况。2、stm32设置参数添加完定时器重新注释掉stm32f1xx_it.c的SVC_Handler和PendSV_Handler函数。3、main.c代码4、FreeRTOSConfig.h代码/*3.中断嵌套行为相关配置cm3内核:我们要求4个优先级位全部为抢占优先级位最高优先级是0最低优先级是15*//*设置RTOS内核自身使用的中断优先级。一般设置为最低优先级,不至于屏蔽其他优先级程序*/#defineconfigKERNEL_INTERRUPT_PRIORITY (154)/*设置了调用中断安全的FreeRTOS API函数的最高中断优先级。FreeRTOS的管理的最高优先级*/#defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY (54)/*同上.仅用于新版移植。这两者是等效的。*/#defineconfigMAX_API_CALL_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY5、freertos_demo.c代码三、时间片调度在FreeRTOS中同等优先级的任务会轮流分享相同的CPU时间这个时间被称为时间片。在这里一个时间片的长度等同于SysTick中断的周期。1、实验目标理解FreeRTOS的时间片调度start_task用来创建其他的2个任务。task1通过串口打印task1的运行次数设置任务优先级为2。task2通过串口打印task2的运行次数设置任务优先级为2。为了更好观察现象滴答定时器的中断频率设置为50ms中断一次一个时间片。2、FreeRTOSConfig.h代码清单#defineconfigUSE_TIME_SLICING1#defineconfigUSE_PREEMPTION1#defineconfigTICK_RATE_HZ ( (TickType_t)20)3、freertos_demo.c代码