[an error occurred while processing this directive]
Объясняю "на пальцах" :-)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено AK 26 сентября 2002 г. 16:23
В ответ на: Не понял, а в чём вопрос? :-) отправлено AlexD 26 сентября 2002 г. 15:19

Надо сделать ядро, которое передает управление задачам и получает назад управление от задач.
Для задач надо создать некий сервис, то ли в форме макроса, то ли в форме функции, при помощи которого они могли бы из любой ("наружной") точки возвращать управление ядру.
Задача при этом будет выглядеть как некая функция, типа такой


void my_task_1(void)
{
... // инициализируем задачу
while ( 1!=0) // далее - бесконечный цикл
{
... // делаем что-то полезное
delay(10); // возвращаем управление ядру на 10 тиков
... // опять делаем что-то полезное
delay(0); // возвращаем управление ядру на 0 тиков
... // опять делаем что-то полезное
// и т.д.
}
}

На ассемблере написать эквивалент этого сервиса void delay(int Time) - плевое дело:
-- загоняю Time, скажем, в регистр
-- вызываю подпрограмму delay
-- в теле подпрограммы беру номер текущей задачи из глобальной переменной Current_Task_No
-- лезу в таблицу и присваиваю счетчику тиков текущей задачи значение Time
-- опять лезу в таблицу и запоминаю в ней значение указателя стека для текущей задачи
-- делаю goto на известную глобальную метку, попадаю в ядро

Ядро, ясное дело, увеличивает номер текущей задачи, проверяет надо ли ей передавать управление, и, если надо, восстанавливает указатель стека из таблица и исполняет return. После этого задача получает управление как раз в нужной точке.

А на сях как это сделать?

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru