ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
10 июля
1595445 Топик полностью
Nikolay_Po (Сегодня, 14:25, просмотров: 28) ответил Nikolay_Po на RISC-V, прерывания, стек прерываний и mscratch применительно к ОСРВ Задал вопрос в телеграм-канале RISC-V MCU. Задам и тут:
Доделал я порт FreeRTOS для QingKeV4 с включённой вложенностью прерываний. Как тов. Клен тут пояснял в своих примерах, ограничился только прерываниями с HPE, то есть, уровень вложенности до 3х включительно. 

Мне такой вложенности хватает - нужно соблюсти предсказуемые времянки для аппаратного обеспечения и, кроме низшего уровня аппаратных прерываний для самой ОС, остаётся ещё один уровень для прерываний, использующих RTOS_API. Жить можно.

Вопрос с переключением стека вложенных прерываний, когда высокоприоритетные прерывания не блокируются, и могут прервать любые прерывания ОС, решил ассемблерным прологом/эпилогом, вызываемым как функции (чтобы аргументом передавать адрес ячейки памяти, где сохраняется факт переключения/не переключения стека). В итоге, прерывания низшего приоритета просто переключают стек при входе и переключают его обратно при выходе. А вот прерывания всех других приоритетов, снабжены моим условным переключателем, который смотрит, где стек - в задачах или в прерываниях. И если текущий указатель стека в задачах, то переключает стек на прерывания, чтобы не мусорить в задачах. При входе - проверяет, было ли переключение. И переключает обратно. Просто переключать нельзя - прерывание может быть первым, без вложенности (нужно переключение), а может быть вложенным (не нужно переключения - уже переключено).

Было много проблем, много нюансов, несколько подходов. В итоге, схема работает, но пришлось сделать сами прерывания naked и безусловно сохранять и восстанавливать 12 регистров, которые не сохраняет HPE - x8, x9 и x18-x27. Работает.