使用了前面实现的定时器中断ISR实现了简单的调度,这个调度自然不是很好,因为不能够充分利用MCU的性能。不过,做一个简单的测试还是可以的了。
前面已经实现了一个1ms的ISR,我增加了一个计数器,之后利用计数器的数值进行任务调度的实现。
主要的代码:
ISR(TIMER1_COMPA_vect)
{
timer_isr_counter++;
if(timer_isr_counter % 20 == 0)
{
task_20ms();
}
if(timer_isr_counter % 50 == 0)
{
task_50ms();
}
if(timer_isr_counter % 100 == 0)
{
task_100ms();
}
if(timer_isr_counter % 1000 == 0)
{
task_1000ms();
timer_isr_counter = 0;
}
}
之后,加入测试代码:
void task_1000ms(void)
{
LedToggle();
}
void LedToggle(void)
{
if(led_value == 0)
{
digitalWrite(LED_BUILTIN, LOW);
led_value = 1;
}
else
{
digitalWrite(LED_BUILTIN, HIGH);
led_value = 0;
}
Serial.println(timer_isr_counter);
}
方便查看,我在LED闪烁的同时增加了串口打印。
编译烧写之后,看得到LED的规律闪烁,同时串口能够打印出如下信息:
整体的效果还算是OK。