打印
[STM32]

FreeRTOS+HAL库初始化系统时遇到的问题探讨

[复制链接]
2653|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LMCH|  楼主 | 2017-5-24 13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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启动后在初始化任务中进行初始化工作,初始化完成后删除该任务。

相关帖子

沙发
whtwhtw| | 2017-6-5 09:28 | 只看该作者
确实存在这个问题,main()中SystemClock_Config()对systick进行了初始化,系统初始化中对systick又重新进行了初始化,如果在main()中修改systick重载值,freertos初始化后就又变了。系统虽然会用,但是除了配置文件外,systick初始化在系统哪里实现的还没整明白。

使用特权

评论回复
板凳
LMCH|  楼主 | 2017-6-5 12:17 | 只看该作者
whtwhtw 发表于 2017-6-5 09:28
确实存在这个问题,main()中SystemClock_Config()对systick进行了初始化,系统初始化中对systick又重新进 ...

就在xPortStartScheduler()中你会追查到对SysTick的初始化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

62

帖子

2

粉丝