Написать обработчик прерываний по таймеру handler:, который переключает контекст выполнения между двумя задачами, а после истечения тайм-аута — выполняет третью. Написать также подпрограмму init:, которой передаётся 6 параметров (через регистры a*):
- Адрес первой задачи
- Продолжительность такта (квант работы) первой задачи
- Адрес второй задачи
- Продолжительность такта (квант работы) второй задачи
- Адрес завершающей задачи
- Время, по истечении которого надо запустить завершающую задачу
Требования и допущения:
Задачи используют только регистры типа a* и не используют стек, для простоты сохранения контекста
Алгоритм работы обработчика: переключить контекст на другую задачу (включая uepc), выставить таймер равным кванту работы этой задачи; когда придёт время завершения, таймер не выставлять, а вернуться сразу в завершающую задачу
Первая и вторая «задачи» в данном задании — это бесконечно работающие фрагменты кода, начинающиеся с определённого адреса; третья — фрагмент кода, вызывающий по окончании работы ecall 10.
Значения очень сильно отличаются от запуска к запуску и сильно зависят от производительности компьютера (привет Java?), так что если одно число результата примерно в два раза больше другого, то и ладно.
- Вводится три числа:
- квант работы первой задачи в миллисекундах,
- квант работы первой второй в миллисекундах,
- общее время работы в миллисекундах
29 58 3000
Как уже было сказано, результат очень приблизительный и на разных машинах разный.
551645 1114830