前言:前面陆续写了4篇【单片机裸机代码框架设计思路】,有些细心的读者发现了存在小bug,

所以特地补充了一篇来说明bug的原因以及解决方案

bug现象:当g_task_ticks在定时器中断函数中自增,当超过65535之后,就一定会溢出变成了0.

此时就会出现一直执行该任务,而不会按照定时周期来。

我举例说明如下:

假如当g_task_ticks =65530, g_task_ticks>timeout时,会执行一次该任务,同时timeout会重新赋值成65530+500=494,那么下一个轮回,g_task_ticks=65531 > 494,任务又会被执行,这个时候就异常了,无法做到定时500个心跳来执行一次任务。

打开网易新闻 查看精彩图片

实际我仿真效果如下,可以看到此bug现象,在g_task_ticks快要溢出之前的那一段,任务被一直执行,根本不会按照预期设定的定时时间来。

打开网易新闻 查看精彩图片

解决方案:当前获取的g_task_ticks减去上次执行该任务时的backupTicks值,如果大于定时时间timeout,那么就执行该任务。

打开网易新闻 查看精彩图片

仿真结果如下:

打开网易新闻 查看精彩图片