ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
2 мая
1057305 Топик полностью
Dingo (02.12.2020 08:46, просмотров: 553) ответил Dingo на Появился зуд, хочу попробовать написать что-нибудь вытесняющее, дабы лучше понять как работают OS. В связи с чем вопросы к донам и дуэньям.
Первое, что задышало. 

Переключает 4 задачи по очереди. Для меги8, пока только на симуляторе студии гонял.


Не сделано: примитивы(ни одного); приоритеты, очередь, разный размер памяти под задачи, ...


Сделано: ассемблерная часть, переключение задач.


Спорные моменты: задача №0 всегда main(). Место под стек выделять не нужно(а вот управление - вполне можно), так как из неё происходит первое переключение. Бага или фича - не знаю.

Указатель в памяти имеет обратный порядок байт по сравнению с сохраняемым/восстанавливаемым содержимым SP. ЧЯНТД? Вылезло при инициализации в task_create().

Прототип функции планировщика: если void fn(void), то без глобальных переменных не обойтись. Сейчас void* fn(void*) - входной фрейм из которорого пришли, на выходе новый.

И вот тут у меня вопрос: рано или поздно понадобится вызвать планировщик не из прерывания, например - при ожидании захвата ресурса. Как это грамотно сделать и как это обычно делается?

Готов ловить тапки и внимать советам.


PS: Только что мысль посетила: имеет смысл для МК делать создание задачи через fork()? Если передать в функцию указатель на новый стек, а по выходному параметру, как и в оригинальном, ветвиться? Или такой путь сложней получится?

main.c.zip