使用了前面实现的定时器中断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的规律闪烁,同时串口能够打印出如下信息:

096_Arduino一个简单的任务调度实现_任务调度

         整体的效果还算是OK。