本帖最后由 LMCH 于 2017-5-24 13:12 编辑
在官方给的实例代码中,在STM32F4启动后会执行system_stm32f4xx.c中的SystemInit()函数,对RCC和向量表进行配置,随后进入main函数,首先调用stm32f4xx_hal.c中的HAL_Init()函数,对flash、NVIC中中断分组和SysTick进行配置,配置SysTick时调用了同一个文件中的HAL_InitTick()函数;再调用SystemClock_Config(),对RCC进一步配置,这里要调用stm32f4xx_hal.c中的HAL_RCC_ClockConfig()函数,在这里会更新一个全局变量SystemCoreClock,它保存系统的时钟频率,然后利用这个系统时钟频率又调用HAL_InitTick()对SysTick进行配置。
不管怎样,这里都对SysTick进行了配置,设置了SysTick中断频率和中断优先级,且打开了中断请求。问题就在这里,在FreeRTOS中使用SysTick中断作为系统任务调度的时基,其中断服务函数为port.c文件中的xPortSysTickHandler()函数,它调用task.c文件中的xTaskIncrementTick()函数进行任务调度。
如果系统启动便首先将SysTick中断打开,系统的初始化过程又较复杂,需要的时间大于SysTick的中断周期,程序会跑飞。通过FreeRTOS的port.c文件中的xPortStartScheduler()函数可以看到,在OS初始化任务后,启动调度器之前,会对SysTick进行配置,因此,在前面的初始化过程中最好不要开SysTick,应该修改HAL库中HAL_Init()函数和HAL_RCC_ClockConfig()函数的代码,将HAL_InitTick()注释掉或直接删除。
还有一个解决办法是在某些情况下可以将初始化工作作为一个初始化任务,OS启动后在初始化任务中进行初始化工作,初始化完成后删除该任务。 |