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