Мне такой вложенности хватает - нужно соблюсти предсказуемые времянки для аппаратного обеспечения и, кроме низшего уровня аппаратных прерываний для самой ОС, остаётся ещё один уровень для прерываний, использующих RTOS_API. Жить можно.
Вопрос с переключением стека вложенных прерываний, когда высокоприоритетные прерывания не блокируются, и могут прервать любые прерывания ОС, решил ассемблерным прологом/эпилогом, вызываемым как функции (чтобы аргументом передавать адрес ячейки памяти, где сохраняется факт переключения/не переключения стека). В итоге, прерывания низшего приоритета просто переключают стек при входе и переключают его обратно при выходе. А вот прерывания всех других приоритетов, снабжены моим условным переключателем, который смотрит, где стек - в задачах или в прерываниях. И если текущий указатель стека в задачах, то переключает стек на прерывания, чтобы не мусорить в задачах. При входе - проверяет, было ли переключение. И переключает обратно. Просто переключать нельзя - прерывание может быть первым, без вложенности (нужно переключение), а может быть вложенным (не нужно переключения - уже переключено).
Было много проблем, много нюансов, несколько подходов. В итоге, схема работает, но пришлось сделать сами прерывания naked и безусловно сохранять и восстанавливать 12 регистров, которые не сохраняет HPE - x8, x9 и x18-x27. Работает.