ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
11 июня
1591082 Топик полностью
Yft (Сегодня, 17:11, просмотров: 23) ответил Nikolay_Po на RISC-V, прерывания, стек прерываний и mscratch применительно к ОСРВ Задал вопрос в телеграм-канале RISC-V MCU. Задам и тут:
А нет желания спросить у синего кита? Он тоже китайский, про свои родные контроллеры ответят: ### Резюме по вашим вопросам: 1. **Верно.** Каждое прерывание (и вложенное в том числе), которое может вызвать переключение контекста, должно работать на выделенном стеке прерываний, чтобы не затереть стек задачи. 2. **Верно.** Использовать `naked` обязательно. Компилятор не знает про `mscratch` и вашу логику переключения стеков. Только ручное управление контекстом спасет 

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