ситуацию[citation:3]. 3. **Вложенность.** Переключать `sp` через `mscratch` нужно **условно**: * Если `mscratch` хранит корректный адрес (не `NULL`) -> идем из задачи -> меняем местами. * Если `mscratch == NULL` (или вы сами обнулили его в первом прерывании) -> идем из прерывания -> **не меняем** `sp`, оставляем текущий стек прерываний. * **Главное правило:** `mscratch` либо хранит указатель на **стек задачи** (когда мы в прерывании), либо указатель на **стек прерываний** (когда мы в задаче). Обмен должен происходить только при смене контекста "задача <-> прерывание", а не "прерывание <-> прерывание"[citation:2][citation:10]. Ваш подход на CH32V317 верный. Игнорирование вложенности и использование единого стека — это путь к "тихим" багам, когда система падает раз в сутки. Использование `mscratch` с условным переключением — это стандарт де-факто для RISC-V RTOS.