Первое, что задышало. Переключает 4 задачи по очереди. Для меги8, пока только на симуляторе студии гонял.
Не сделано: примитивы(ни одного); приоритеты, очередь, разный размер памяти под задачи, ...
Сделано: ассемблерная часть, переключение задач.
Спорные моменты: задача №0 всегда main(). Место под стек выделять не нужно(а вот управление - вполне можно), так как из неё происходит первое переключение. Бага или фича - не знаю.
Указатель в памяти имеет обратный порядок байт по сравнению с сохраняемым/восстанавливаемым содержимым SP. ЧЯНТД? Вылезло при инициализации в task_create().
Прототип функции планировщика: если void fn(void), то без глобальных переменных не обойтись. Сейчас void* fn(void*) - входной фрейм из которорого пришли, на выходе новый.
И вот тут у меня вопрос: рано или поздно понадобится вызвать планировщик не из прерывания, например - при ожидании захвата ресурса. Как это грамотно сделать и как это обычно делается?
Готов ловить тапки и внимать советам.
PS: Только что мысль посетила: имеет смысл для МК делать создание задачи через fork()? Если передать в функцию указатель на новый стек, а по выходному параметру, как и в оригинальном, ветвиться? Или такой путь сложней получится?
main.c.zip