Цитата(Beginning @ Apr 28 2010, 18:13)

1.Поток (кусок кода в while(1){}) будет выполняться пока
a) надо вызвать паузу (за это отвечает функция, как я понял, Sleep)
а) не захочет сам отдать управление. Например, на определенное время функцией Sleep() или обратившись к функции одного из сервисов, для которой не готовы данные. Как то: TEventFlag::Wait() если флаг не взведен, TMutex::Lock() если данный мутекс уже залочен другим потоком, channel::pop() если в канале нет данных, channel::push() если в канале нет свободного места ну и т.д.
Цитата(Beginning @ Apr 28 2010, 18:13)

б)не произойдёт прерывание переферии, внутри которого произойдёт переключения контекста. Для этого мы в обработчики прерывания вставляем объект класса TISR_Wrapper. Вставляем этот объект, например, в прерывание UART recive.
внутри которого будет вызвана одна из функций сервисов, в результате выполнения которой готовым к выполнению окажется процесс с приоритетом выше текущего.
Цитата(Beginning @ Apr 28 2010, 18:13)

в) Прерывание системного таймера. Таймер настроенный на срабатывание через определённый промежуток времени для проверки надо ли переключать контекст.
Таймер просто считает таймауты для процессов, усыпленных с таймаутом. Таймаут истек - процесс готов к выполнению. Далее работает тот же механизм, что и при обычных "осевых" прерываниях - если "пробудился" поток с приоритетом большим текущего - вызывается планировщик.
Цитата(Beginning @ Apr 28 2010, 18:13)

2. Шедулер или планировщик. Кусок кода который контролирует паузы для потоков – т.е. инкрементирует их если надо, смотрит какие флаги взвелись для ожидающих их потоков и т.д. ну и соответственно переключает потоки.
Нет. планировщик только передает управление потоку с наивысшим приоритетом из готовых к выполнению.
Цитата(Beginning @ Apr 28 2010, 18:13)

Время срабатывания решил поставить 1мс. И для этого в теле прерывания надо таймер инитить TCNT0 = 0x8D, это при кварце 7.3728.
Вы не учитываете, что "за время пути собака могла подрасти". Пока исполнение дойдет до точки, где вы перезаписываете счетчик, таймер может сделать несколько тиков. Поэтому надо делать TCNT0 -= 0x100-0x8D.
Цитата(Beginning @ Apr 28 2010, 18:13)

Порыл код и догадалcя что вроде для этого есть функция void OS::SystemTimerUserHook(), короче туда и вставил. Правильно сделал?
Да.
Цитата(Beginning @ Apr 28 2010, 18:13)

Теперь эпопея номер два – програмное прерывание. Почитал за него. Блин, сложно въехать в сакраментальный смысл его использования,
Вам надо переключить контекст. Процедура восстановления контекста считывает со стека процесса данные и в определнном порядке записывает их в регистры. Значит, в том же порядке содержимое регистров должно быть записано на стек процедурой сохранения контекста. Поскольку перепланировка может потребоваться в каком-либо из прерываний, а компилятор в обработчике этого прерывания уже сложил на стек какое-то количество регистров получится, что часть регистров сохранена на стеке дважды. Чтобы этого избежать, используется дополнительное прерывание, в ассемблерном обработчике которого регистры складываются на стек "с чистого листа".
Цитата(Beginning @ Apr 28 2010, 18:13)

костыль в виде соединения пинов мне не подходит. Отсюда мой первый вопрос. Как выпутаться из этой проблемы?
Используйте прерывание SPM. Пример есть в портах под avr-gcc.
Вы не указали свой компилятор