[an error occurred while processing this directive]
Объясняю "на пальцах" :-)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
Надо сделать ядро, которое передает управление задачам и получает назад управление от задач.
Для задач надо создать некий сервис, то ли в форме макроса, то ли в форме функции, при помощи которого они могли бы из любой ("наружной") точки возвращать управление ядру.
Задача при этом будет выглядеть как некая функция, типа такой
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. После этого задача получает управление как раз в нужной точке.
А на сях как это сделать?
Составить ответ
|||
Конференция
|||
Архив
Ответы
- Только Вы, AK, кое о чём умалчиваете(+) — AlexD (27.09.2002 10:09, 896 байт)
- Ответ: Это, скорей не "на пальцах", а на руках.. А,вот, на пальцах...(+) — SERG-ANT (26.09.2002 18:25, 1169 байт)
- Ответ: — AK (27.09.2002 02:01, 1089 байт)
- Все на C написать и не получится, как минимум функцию переключения контекста необходимо писать на асм. Со стеком из С не очень то поработаешь... — Sergey Pinigin (26.09.2002 16:53, 59 байт)
Перейти к списку ответов
|||
Конференция
|||
Архив
|||
Главная страница
|||
Содержание
|||
Без кадра
E-mail:
info@telesys.ru