前面做了一个RTC的例程,在main函数的while循环中通过计数器累加做了一个简单的延时间隔。但是从打印的效果看,不是很精准。接下来实现一个稍微精准一点的任务调度。

         其实,像这么少的任务量,直接跑个中断ISR也就可以了,毕竟是学习例程。如果是应用,自然还是OS或者调度器做一个更好的管理。

         之前也实现了SysTick,其实基于这个,简单的任务调度一下子就做的出来。SysTick本身的handler可以简单考虑为一个1ms的task,做一个计数器就可以实现1000ms的调度。之后,我可以利用这个1000ms的调度打印一下RTC的时间。

         核心的调度相关设计代码:

void HAL_SYSTICK_Callback(void)
{
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_SYSTICK_Callback could be implemented in the user file
*/
if (systick_counter_1ms % 1000 == 0U)
{
task_1000ms();
}
systick_counter_1ms++;
}
void task_1000ms(void)
{
rtc_time_display();
}

void HAL_IncTick(void)
{
HAL_SYSTICK_Callback();
}

         其中,用于测试的RTC打印代码:

void rtc_time_display(void)
{
#if BCD_MODE
HAL_RTC_GetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BCD);
HAL_RTC_GetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BCD);
printf("%02x:%02x:%02x\n\r", hacking_test_time.Hours, hacking_test_time.Minutes, hacking_test_time.Seconds);
#else
HAL_RTC_GetTime(&hrtc, &hacking_test_time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &hacking_test_date, RTC_FORMAT_BIN);
printf("%02d:%02d:%02d\n\r", hacking_test_time.Hours, hacking_test_time.Minutes, hacking_test_time.Seconds);
#endif
}

         编译链接成功之后,烧写测试:

143_STM32F407_简单的周期性任务调度_github

         从输出结果看,现在的准确度比之前好多了,至少没有出现重复输出的现象。后续,改进的方案我不再考虑简单的调度器了,直接考虑使用OS。这样,也能够顺利的打开新的学习篇章。