RISC-V, прерывания, стек прерываний и mscratch применительно к ОСРВ
Задал вопрос в телеграм-канале RISC-V MCU. Задам и тут: Корифеи RISC-V, подскажите по такому вопросу:
Вот, дорабатываю я порт RTOS на CH32V317. В оригинале, там все прерывания ОС имеют одинаковый приоритет и до начала манипуляций со стеком, используется один из приёмов: а) блокируются вообще все прерывания; б) используется mscratch, и значение указателя стека переключается между стеком прерывания и стеком нормального исполнения.
-=-
Проблема у меня вот такая:
Когда ОСРВ, в своём прерывании таймера или переключателя контекста, начинает переключение контекста, она меняет занчение указателя стека и меняет данные в стеке в произвольном порядке (а не строго по заполнению/опустошению. Поэтому обычное вложенное прерывание в таком случае невозможно - проталкивание контекста в стек, выполняемое при обычном прерывании, затрёт блок данных стека, который до входа во вложенное прерывание, модифицировал переключатель контекста. Верно ли я понимаю, что:
1. Для любого прерывания, которое может быть вложено в прерывание ОСРВ, необходимо использовать свой стек и нужно модифицировать указатель стека перед его использованием?
2. Исходя из п. 1, для вложенных прерываний, невозможно использовать стандартный код сохранения/восстановления контекста, который создаёт компилятор. А значит, вложенные прерывания нужно объявлять naked и сохранять контекст вручную до выполнения кода прерывания, использующего стек. А потом восстанавливать контекст вручную?
3. Переключение указателя стека для прерываний, удобно делать при помощи mscratch. Но если это вложенное прерывание? Куда переключить указатель стека? Нужно модифицировать сам mscratch? Если да, то где? В первом прерывании или во вложенном?