企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
SysTick中断服务函数是一个非常重要的函数,FreeRTOS所有跟时间相关的事情都在里面处理,SysTick就是FreeRTOS的一个心跳时钟,驱动着FreeRTOS的运行,就像人的心跳一样,假如没有心跳,我们就相当于“死了”,同样的,FreeRTOS没有了心跳,那么它就会卡死在某个地方,不能进行任务调度,不能运行任何的东西,因此我们需要实现一个FreeRTOS的心跳时钟,FreeRTOS帮我们实现了SysTick的启动的配置:在port.c文件中已经实现vPortSetupTimerInterrupt()函数,并且FreeRTOS通用的SysTick中断服务函数也实现了:在port.c文件中已经实现xPortSysTickHandler()函数,所以移植的时候只需要我们在stm32f4xx\_it.c文件中实现我们对应(STM32)平台上的SysTick\_Handler()函数即可。FreeRTOS为开发者考虑得特别多,PendSV\_Handler()与SVC\_Handler()这两个很重要的函数都帮我们实现了,在在port.c文件中已经实现xPortPendSVHandler()与vPortSVCHandler()函数,防止我们自己实现不了,那么在stm32f4xx\_it.c中就需要我们注释掉或者删除掉PendSV\_Handler()与SVC\_Handler()这两个函数了,具体实现见代码清单8‑1加粗部分。 ``` 1 /* Includes ----------------------------------------------------------*/ 2 #include "main.h" 3 #include "stm32f4xx_it.h" 4 #include "./usart/bsp_debug_usart.h" 5 6 #include "FreeRTOS.h" //FreeRTOS使用 7 #include "task.h" 8 9 /** @addtogroup STM32F4xx_HAL_Examples 10 * @{ 11 */ 12 13 /** @addtogroup GPIO_EXTI 14 * @{ 15 */ 16 17 /* Private typedef ----------------------------------------------*/ 18 /* Private define ------------------------------------------------*/ 19 /* Private macro -------------------------------------------------*/ 20 /* Private variables --------------------------------------------*/ 21 /* Private function prototypes -------------------------------------*/ 22 /* Private functions ---------------------------------------------*/ 23 24 /*******************************************************************/ 25 /* Cortex-M4 Processor Exceptions Handlers */ 26 /*****************************************************************/ 27 28 /** 29 * @brief This function handles NMI exception. 30 * @param None 31 * @retval None 32 */ 33 void NMI_Handler(void) 34 { 35 } 36 37 /** 38 * @brief This function handles Hard Fault exception. 39 * @param None 40 * @retval None 41 */ 42 //void HardFault_Handler(void) 43 //{ 44 // /* Go to infinite loop when Hard Fault exception occurs */ 45 // while (1) 46 // { 47 // } 48 //} 49 50 /** 51 * @brief This function handles Memory Manage exception. 52 * @param None 53 * @retval None 54 */ 55 void MemManage_Handler(void) 56 { 57 /* Go to infinite loop when Memory Manage exception occurs */ 58 while (1) 59 { 60 } 61 } 62 63 /** 64 * @brief This function handles Bus Fault exception. 65 * @param None 66 * @retval None 67 */ 68 void BusFault_Handler(void) 69 { 70 /* Go to infinite loop when Bus Fault exception occurs */ 71 while (1) 72 { 73 } 74 } 75 76 /** 77 * @brief This function handles Usage Fault exception. 78 * @param None 79 * @retval None 80 */ 81 void UsageFault_Handler(void) 82 { 83 /* Go to infinite loop when Usage Fault exception occurs */ 84 while (1) 85 { 86 } 87 } 88 89 /** 90 * @brief This function handles Debug Monitor exception. 91 * @param None 92 * @retval None 93 */ 94 void DebugMon_Handler(void) 95 { 96 } 97 98 99 100 /** 101 * @brief This function handles SysTick Handler. 102 * @param None 103 * @retval None 104 */ 105 extern void xPortSysTickHandler(void); 106 107 void SysTick_Handler(void) 108 { 109 uint32_t ulReturn; 110 /* 进入临界段,临界段可以嵌套 */ 111 ulReturn = taskENTER_CRITICAL_FROM_ISR(); 112 113 HAL_IncTick(); 114 #if (INCLUDE_xTaskGetSchedulerState == 1 ) 115 if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) 116 { 117 #endif /* INCLUDE_xTaskGetSchedulerState */ 118 xPortSysTickHandler(); 119 #if (INCLUDE_xTaskGetSchedulerState == 1 ) 120 } 121 #endif /* INCLUDE_xTaskGetSchedulerState */ 122 123 /* 退出临界段 */ 124 taskEXIT_CRITICAL_FROM_ISR( ulReturn ); 125 } ```