Не, я об оптимизации сильно не задумывался. Чтобы включить
отдельный обработчик для прерывания нужно как минимум установить
соответствующий аттрибут как Vectored. https://github.com/evgeniy1294/mpp/blob/master/src/irq/gigadevice/gd32v_irq_v1.hpp
Также нужно не забыть установить адрес таблицы в MTVT, с этим вроде как у вас порядок.
/* Устанавливаем указатель на таблицу прерываний для цепочечной обработки прерываний */
mpp::core::MTVT::Write( reinterpret_cast(InterruptVectorTable.data()) );
Повторюсь, этот режим я не проверял, возможно требуется что-то ещё. Для ускорения работы, как вариант, можно не сохранять контекст, а использовать stackless(вроде они так называются) функции - контекст сохранять не нужно, если он не портится. У меня на гитхабе есть некоторый код под этот камень
https://github.com/evgeniy1294/mpp