Preemptive Multitasking требует двух основных компонентов: прерывания по таймеру (скажем, каждые 10 мсек) и планировщика, который «связан» с этим прерыванием.Затем планировщик сохраняет «контекст» задачи «прерванная / прерванная» (которая является причудливым термином для всех регистров / указателя стека) в некоторой области (например, стеке), а затем через свой алгоритм планирования определяет, какая (другая) задача может «беги "дальше.Если он находит его, он раскручивает / восстанавливает контекст для задачи TH и возвращается из прерывания таймера.Кстати, точно так же, как «вызов», который помещает адрес возврата (обычно адрес после инструкции Call в стеке, прерывание работает так же, и когда прерывание «возвращается», оно использует то, что находится в стеке, и переходит к нему.Поэтому, когда мы возвращаемся из какой-либо другой задачи в точку ее «прерывания», нам просто нужно манипулировать стеком, поместить адрес возврата из задачи THAT в верхнюю часть стека и выполнить инструкцию «Return-from_Interrupt».нормальное возвращение. Бьюсь об заклад, вы теперь жаль, что вы спросили! Ура,