1. Запретить раз и навсегда прерывания. 2. Разбить каждую задачу на элементарные шаги и разместить их в массиве. 3. Создать структуру, где будет храниться: указатель на функуию-шаг задачи, переменная-индекс шага, перменная для таймера и т.п.. >>
Отправлено
VasilyS 25 декабря 2009, г. 22:39
В ответ на:
Что можно использовать для реализации потоков (thread) на AVR (+) отправлено пользователем
MikhailSh 25 декабря 2009, г. 19:35
3. Сделать то же для других задач.
4. Запускать задачи по указателям в цикле.
PS. В каждом шаге каждой задачи обновлять номер шага Nom_Step, чтобы
в следующий раз запускался новый шаг.
PPS Написание самих задач очень похожи на программирование на Бейсике: cделал шаг - перейди на другой (вперед или назад).
Дешево, быстро, лехко.
while(1)
{ // Запуск текущих шагов задач по кругу.
(*Tsk1.PtrToStep)[ Tsk1.Nom_Step ]();
(*Tsk2.PtrToStep)[ Tsk2.Nom_Step ]();
(*Tsk3.PtrToStep)[ Tsk3.Nom_Step ]();
// обслуживание индивидуальных таймаутов для каждой задачи
if( Timer2mS_Over) { // системный квант пусть 2 мс
ClearFlag2ms;
if( Tsk1.Timeout ) Tsk1.Timeout--;
if( Tsk3.Timeout ) Tsk3.Timeout--;
}
_WDR();
}