动态切换CPU频率在SOC的层面比较简单,但是对于RTOS环境,切换频率后直接导致的一个问题就是之前的tick不准了。
比如做task delay,主频从600MHz降到100MHz,tick的时间基准变了,导致定时时间也会变。
实测1秒delay降频后变成6秒delay。
解决方法,见下面的code。
void set_core_100MHz(void)
{
CLOCK_SetDiv(kCLOCK_AhbDiv, 5);
SystemCoreClockUpdate();
vPortSetupTimerInterrupt();
}
void set_core_600MHz(void)
{
CLOCK_SetDiv(kCLOCK_AhbDiv, 0);
SystemCoreClockUpdate();
vPortSetupTimerInterrupt();
}
需要重新配置SDK的系统时间参数,以及freeRTOS的tick。
经测试,上面的代码在切换系统频率后,task delay能保持恒定时间超时返回。
简书, 郭嘉16038, 于2020.05.13