В.Н.> К большому сожалению, я ардуиню очень и очень через раз. соответственно, к следующему разу, когда у меня получается этим вплотную заняться, я забываю все свои прежние достижения. Мне даже приходится вспоминать синтаксис простейших команд.
поэтому учить надо не С++ или Си, а Ассемблер. Языки они как мода, приходят и уходят, а ассемблер всегда ОДИН. Вот возьмем следующую программу мигалки для ATtiny:
// blink.c for AVR ATtiny 13/25/45/85
#include <avr/io.h>
#define F_CPU 1000000UL // частота резонатора 1МГц
#include <util/delay.h>
int main(void) {
// макрос _BV(число) заменяет конструкцию (1 << число)
DDRB |= _BV(PB0); // аналог pinMode(PB0,OUTPUT); в Wiring
for (;;) {
PORTB ^= _BV(PB0); // инвертируем состояние порта PB0
_delay_ms(1000); // ждем 1 секунду
}
return 0;
}
компилятор преобразует ее в следующий ассемблерный код:
Здесь, к примеру, функция main() начинается с адреса 22. У всех функций есть адреса. Функции в ассемблере называются подпрограммами. Их можно запустить на выполнение инструкцией "rcall адрес_подпрограммы".
Как всем известно, функции могут принимать параметры. Например func(int foo, int bar) и т.д. Это называют аргументами функции. Но в качестве параметра можно передавать и адрес функции для их последующего выполнения. Такие функции называются коллбэк(callback) функциями.
Теперь о том, как работает планировщик. Допустим у нас есть прерывание таймера, которое вызывается раз в 1 мс. Теперь пишем таблицу с тремя столбцами. В первом столбце пусть будет адрес функции опроса первого датчика, в втором столбце пусть будет интервал вызова данной функции в миллисекундах, в третьем столбце путь будет счетчик в миллисекундах. Во второй строке все тоже самое для второго датчика, в третьей для третьего и т.д.
Теперь при каждом срабатывании обработчика таймера, он будет вычитать из счетчиков задач по единице. Ту задачу, у которой счетчик обнулится, он будет запускать на выполнение, после чего в счетчик записывается значение интервала. И все начинается снова. Так и работает планировщик задач.
Если написать программу опроса алгоритмическим способом, то такая программа будет статична. Порядок опроса датчиков нельзя будет поменять. Если же написать ее через планировщик, то через манипулирование таблицей, можно менять порядок выполнения задач, частоту опроса, снимать задачи, добавлять задачи, ставить одни задачи как условие запуска других, и т.д.
Понятно, что если имеется три или четыре датчика, то возиться с планировщиком может и не стоит, но в целом, планировщик здорово облегчает программирование микроконтроллеров.