Специально использую класический смайл так как он переводится как улыбка. И ведь так и в жизни... Вот люблю улыбаться...

Но время от времени нарываюсь на неприятности ... ну типа: "чё лыбишься..." или там "Ваша насмешка не уместна".
По моему "улыбка" или "насмешка", - это просто отражение Вашего взгляда на жизнь и окружающих. Я - улыбался.
Последняя попытка оправдаться.

Видишь ли, я использую такой вариант, и пока не планирую от него отказываться. Ваши доводы пока меня не убедили. Такой вариант и аналогичные ему. Ну например ...
В прерывании
.....
cnt_ms500++;
cnt_ms300++;
cnt_ms200++;
.....
В голове
.....
#define wt_tim1 = 4 // 4ms
// Точность определяется периодом цикла головы
.....
if(cnt_ms500 > 500/wt_tim1) {
cnt_ms500 = 0;
// Данный блок исполняется с периодом 500 мс
}
if(cnt_ms300 > 300/wt_tim1) {
cnt_ms300 = 0;
// Данный блок исполняется с периодом 300 мс
}
if(cnt_ms200 > 200/wt_tim1) {
cnt_ms200 = 0;
// Данный блок исполняется с периодом 200 мс
}
....
Конечно это можно сделать и семафорами (и даже лучше если переменные > 1 байта), но сути это не меняет. Подход тот же.
По поводу прерываний. С одной стороны Вы пишете "нонсенс" по поводу моего высказывания "о необходимости минимизировать число прерываний", с другой - ругаете за его применение. Дело в том что таймерные прерывания - самые низкоприоритетные (обычно). А посему я делаю первой командой "sei". Но ещё раз повторяю такое используется ПОПУТНО. Прерывание не задействовано. В этом не минус а плюс такой реализации. Используется прерывание без которого НЕ ОБОЙТИСЬ. И добавляется туда всего ОДНА КОМАНДА. Например регенерация экрана, опрос датчиков, програмный ШИМ, регулярный обмен с внешними устройствами, опрос АЦП по таймеру и т.д.
Если я Вас не убедил, то давайте считать что я просто заблуждаюсь и мне поможет только время.

(улыбка)